aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLukePulverenti <luke.pulverenti@gmail.com>2013-02-23 10:32:54 -0500
committerLukePulverenti <luke.pulverenti@gmail.com>2013-02-23 10:32:54 -0500
commit33ed929b526acbda696f00f5966917ebd6a9ded2 (patch)
tree18e75812ce71274a3e02f800536e8c144f4e5c45
parent02634588710f65ce952d0229d7da6b9c9d341492 (diff)
parente30b96217333cadb78dcc0a47545afd145c683a7 (diff)
Merge branch 'master' of https://github.com/MediaBrowser/MediaBrowser
Conflicts: MediaBrowser.ServerApplication/CorePlugins/MediaBrowser.Api.dll MediaBrowser.ServerApplication/CorePlugins/MediaBrowser.ApiInteraction.Javascript.dll MediaBrowser.ServerApplication/CorePlugins/MediaBrowser.Server.Sqlite.dll MediaBrowser.ServerApplication/CorePlugins/MediaBrowser.Server.WorldWeatherOnline.dll MediaBrowser.ServerApplication/CorePlugins/MediaBrowser.WebDashboard.dll
-rw-r--r--.gitignore2
-rw-r--r--MediaBrowser.Api/Api.cs12
-rw-r--r--MediaBrowser.Api/EnvironmentService.cs5
-rw-r--r--MediaBrowser.Api/HttpHandlers/PlaybackCheckInHandler.cs2
-rw-r--r--MediaBrowser.Api/HttpHandlers/UpdateMediaLibraryHandler.cs6
-rw-r--r--MediaBrowser.Api/Images/ImageService.cs2
-rw-r--r--MediaBrowser.Api/Images/UploadImageHandler.cs2
-rw-r--r--MediaBrowser.Api/LibraryService.cs7
-rw-r--r--MediaBrowser.Api/LocalizationService.cs2
-rw-r--r--MediaBrowser.Api/MediaBrowser.Api.csproj1
-rw-r--r--MediaBrowser.Api/PackageService.cs2
-rw-r--r--MediaBrowser.Api/Plugin.cs2
-rw-r--r--MediaBrowser.Api/PluginService.cs3
-rw-r--r--MediaBrowser.Api/ScheduledTasks/ScheduledTaskService.cs27
-rw-r--r--MediaBrowser.Api/ScheduledTasks/ScheduledTasksWebSocketListener.cs18
-rw-r--r--MediaBrowser.Api/Streaming/AudioHandler.cs2
-rw-r--r--MediaBrowser.Api/Streaming/BaseStreamingHandler.cs10
-rw-r--r--MediaBrowser.Api/Streaming/HlsAudioPlaylistHandler.cs2
-rw-r--r--MediaBrowser.Api/Streaming/HlsSegmentHandler.cs2
-rw-r--r--MediaBrowser.Api/Streaming/HlsVideoPlaylistHandler.cs2
-rw-r--r--MediaBrowser.Api/Streaming/VideoHandler.cs8
-rw-r--r--MediaBrowser.Api/SystemService.cs2
-rw-r--r--MediaBrowser.Api/UserLibrary/GenresService.cs2
-rw-r--r--MediaBrowser.Api/UserLibrary/ItemsService.cs2
-rw-r--r--MediaBrowser.Api/UserLibrary/PersonsService.cs2
-rw-r--r--MediaBrowser.Api/UserLibrary/StudiosService.cs5
-rw-r--r--MediaBrowser.Api/UserLibrary/UserLibraryService.cs2
-rw-r--r--MediaBrowser.Api/UserLibrary/YearsService.cs2
-rw-r--r--MediaBrowser.Api/UserService.cs2
-rw-r--r--MediaBrowser.Api/WeatherService.cs2
-rw-r--r--MediaBrowser.Api/WebSocket/LogFileWebSocketListener.cs5
-rw-r--r--MediaBrowser.Api/WebSocket/SystemInfoWebSocketListener.cs5
-rw-r--r--MediaBrowser.ApiInteraction.Javascript/JavascriptApiClientService.cs2
-rw-r--r--MediaBrowser.ApiInteraction.Javascript/MediaBrowser.ApiInteraction.Javascript.csproj1
-rw-r--r--MediaBrowser.ApiInteraction.Portable/MediaBrowser.ApiInteraction.Portable.csproj3
-rw-r--r--MediaBrowser.ApiInteraction/ApiClient.cs10
-rw-r--r--MediaBrowser.ApiInteraction/MediaBrowser.ApiInteraction.csproj3
-rw-r--r--MediaBrowser.Common/Kernel/BaseKernel.cs191
-rw-r--r--MediaBrowser.Common/Kernel/IApplicationHost.cs28
-rw-r--r--MediaBrowser.Common/Kernel/IKernel.cs20
-rw-r--r--MediaBrowser.Common/MediaBrowser.Common.csproj12
-rw-r--r--MediaBrowser.Common/Mef/MefUtils.cs80
-rw-r--r--MediaBrowser.Common/Net/HttpServer.cs22
-rw-r--r--MediaBrowser.Common/Net/IUdpServer.cs7
-rw-r--r--MediaBrowser.Common/ScheduledTasks/BaseScheduledTask.cs75
-rw-r--r--MediaBrowser.Common/ScheduledTasks/BaseTaskTrigger.cs4
-rw-r--r--MediaBrowser.Common/ScheduledTasks/DailyTrigger.cs3
-rw-r--r--MediaBrowser.Common/ScheduledTasks/IScheduledTask.cs11
-rw-r--r--MediaBrowser.Common/ScheduledTasks/ITaskManager.cs46
-rw-r--r--MediaBrowser.Common/ScheduledTasks/IntervalTrigger.cs3
-rw-r--r--MediaBrowser.Common/ScheduledTasks/ScheduledTaskHelpers.cs5
-rw-r--r--MediaBrowser.Common/ScheduledTasks/StartupTrigger.cs35
-rw-r--r--MediaBrowser.Common/ScheduledTasks/SystemEventTrigger.cs3
-rw-r--r--MediaBrowser.Common/ScheduledTasks/TaskManager.cs66
-rw-r--r--MediaBrowser.Common/ScheduledTasks/Tasks/DeleteCacheFileTask.cs15
-rw-r--r--MediaBrowser.Common/ScheduledTasks/Tasks/DeleteLogFileTask.cs15
-rw-r--r--MediaBrowser.Common/ScheduledTasks/Tasks/ReloadLoggerTask.cs15
-rw-r--r--MediaBrowser.Common/ScheduledTasks/Tasks/SystemUpdateTask.cs10
-rw-r--r--MediaBrowser.Common/ScheduledTasks/WeeklyTrigger.cs3
-rw-r--r--MediaBrowser.Common/Serialization/DynamicProtobufSerializer.cs13
-rw-r--r--MediaBrowser.Common/packages.config1
-rw-r--r--MediaBrowser.Controller/Drawing/ImageManager.cs4
-rw-r--r--MediaBrowser.Controller/Entities/IVirtualFolderCreator.cs15
-rw-r--r--MediaBrowser.Controller/Entities/Movies/Movie.cs1
-rw-r--r--MediaBrowser.Controller/Entities/TV/Season.cs1
-rw-r--r--MediaBrowser.Controller/Entities/User.cs1
-rw-r--r--MediaBrowser.Controller/IO/DirectoryWatchers.cs16
-rw-r--r--MediaBrowser.Controller/IO/FileSystem.cs (renamed from MediaBrowser.Common/IO/FileSystem.cs)2
-rw-r--r--MediaBrowser.Controller/IO/FileSystemManager.cs8
-rw-r--r--MediaBrowser.Controller/Kernel.cs134
-rw-r--r--MediaBrowser.Controller/Library/ItemResolveArgs.cs1
-rw-r--r--MediaBrowser.Controller/Library/LibraryManager.cs4
-rw-r--r--MediaBrowser.Controller/Localization/BaseStrings.cs5
-rw-r--r--MediaBrowser.Controller/Localization/LocalizedStringData.cs (renamed from MediaBrowser.Common/Localization/LocalizedStringData.cs)2
-rw-r--r--MediaBrowser.Controller/Localization/LocalizedStrings.cs3
-rw-r--r--MediaBrowser.Controller/MediaBrowser.Controller.csproj11
-rw-r--r--MediaBrowser.Controller/MediaInfo/FFMpegManager.cs90
-rw-r--r--MediaBrowser.Controller/Providers/BaseImageEnhancer.cs99
-rw-r--r--MediaBrowser.Controller/Providers/FolderProviderFromXml.cs2
-rw-r--r--MediaBrowser.Controller/Providers/IImageEnhancer.cs55
-rw-r--r--MediaBrowser.Controller/Providers/ImageFromMediaLocationProvider.cs2
-rw-r--r--MediaBrowser.Controller/Providers/ImagesByNameProvider.cs8
-rw-r--r--MediaBrowser.Controller/Providers/MediaInfo/FFMpegAudioImageProvider.cs2
-rw-r--r--MediaBrowser.Controller/Providers/MediaInfo/FFMpegVideoImageProvider.cs20
-rw-r--r--MediaBrowser.Controller/Providers/MediaInfo/FFProbeAudioInfoProvider.cs2
-rw-r--r--MediaBrowser.Controller/Providers/MediaInfo/FFProbeVideoInfoProvider.cs18
-rw-r--r--MediaBrowser.Controller/Providers/Movies/FanArtMovieProvider.cs2
-rw-r--r--MediaBrowser.Controller/Providers/Movies/MovieDbProvider.cs2
-rw-r--r--MediaBrowser.Controller/Providers/Movies/MovieProviderFromJson.cs2
-rw-r--r--MediaBrowser.Controller/Providers/Movies/MovieProviderFromXml.cs2
-rw-r--r--MediaBrowser.Controller/Providers/Movies/PersonProviderFromJson.cs2
-rw-r--r--MediaBrowser.Controller/Providers/Movies/TmdbPersonProvider.cs2
-rw-r--r--MediaBrowser.Controller/Providers/SortNameProvider.cs2
-rw-r--r--MediaBrowser.Controller/Providers/TV/EpisodeImageFromMediaLocationProvider.cs2
-rw-r--r--MediaBrowser.Controller/Providers/TV/EpisodeProviderFromXml.cs2
-rw-r--r--MediaBrowser.Controller/Providers/TV/FanArtTVProvider.cs2
-rw-r--r--MediaBrowser.Controller/Providers/TV/RemoteEpisodeProvider.cs2
-rw-r--r--MediaBrowser.Controller/Providers/TV/RemoteSeasonProvider.cs2
-rw-r--r--MediaBrowser.Controller/Providers/TV/RemoteSeriesProvider.cs2
-rw-r--r--MediaBrowser.Controller/Providers/TV/SeriesProviderFromXml.cs2
-rw-r--r--MediaBrowser.Controller/Resolvers/Audio/AudioResolver.cs16
-rw-r--r--MediaBrowser.Controller/Resolvers/Audio/MusicAlbumResolver.cs16
-rw-r--r--MediaBrowser.Controller/Resolvers/Audio/MusicArtistResolver.cs14
-rw-r--r--MediaBrowser.Controller/Resolvers/CoreResolutionIgnoreRule.cs11
-rw-r--r--MediaBrowser.Controller/Resolvers/EntityResolutionHelper.cs1
-rw-r--r--MediaBrowser.Controller/Resolvers/FolderResolver.cs2
-rw-r--r--MediaBrowser.Controller/Resolvers/IResolutionIgnoreRule.cs (renamed from MediaBrowser.Controller/Resolvers/BaseResolutionIgnoreRule.cs)4
-rw-r--r--MediaBrowser.Controller/Resolvers/LocalTrailerResolver.cs2
-rw-r--r--MediaBrowser.Controller/Resolvers/Movies/BoxSetResolver.cs2
-rw-r--r--MediaBrowser.Controller/Resolvers/Movies/MovieResolver.cs2
-rw-r--r--MediaBrowser.Controller/Resolvers/TV/EpisodeResolver.cs19
-rw-r--r--MediaBrowser.Controller/Resolvers/TV/SeasonResolver.cs15
-rw-r--r--MediaBrowser.Controller/Resolvers/TV/SeriesResolver.cs2
-rw-r--r--MediaBrowser.Controller/Resolvers/VideoResolver.cs2
-rw-r--r--MediaBrowser.Controller/ScheduledTasks/ChapterImagesTask.cs17
-rw-r--r--MediaBrowser.Controller/ScheduledTasks/ImageCleanupTask.cs17
-rw-r--r--MediaBrowser.Controller/ScheduledTasks/PeopleValidationTask.cs13
-rw-r--r--MediaBrowser.Controller/ScheduledTasks/PluginUpdateTask.cs14
-rw-r--r--MediaBrowser.Controller/ScheduledTasks/RefreshMediaLibraryTask.cs15
-rw-r--r--MediaBrowser.Model/DTO/UserItemDataDto.cs2
-rw-r--r--MediaBrowser.Model/MediaBrowser.Model.csproj3
-rw-r--r--MediaBrowser.Plugins.DefaultTheme/MediaBrowser.Plugins.DefaultTheme.csproj1
-rw-r--r--MediaBrowser.Plugins.DefaultTheme/Resources/AppResources.cs6
-rw-r--r--MediaBrowser.Plugins.DefaultTheme/Theme.cs2
-rw-r--r--MediaBrowser.Server.Sqlite/MediaBrowser.Server.Sqlite.csproj1
-rw-r--r--MediaBrowser.Server.Sqlite/SQLiteDisplayPreferencesRepository.cs5
-rw-r--r--MediaBrowser.Server.Sqlite/SQLiteItemRepository.cs5
-rw-r--r--MediaBrowser.Server.Sqlite/SQLiteUserDataRepository.cs5
-rw-r--r--MediaBrowser.Server.Sqlite/SQLiteUserRepository.cs5
-rw-r--r--MediaBrowser.Server.WorldWeatherOnline/MediaBrowser.Server.WorldWeatherOnline.csproj1
-rw-r--r--MediaBrowser.Server.WorldWeatherOnline/WeatherProvider.cs5
-rw-r--r--MediaBrowser.ServerApplication/App.xaml.cs92
-rw-r--r--MediaBrowser.ServerApplication/MediaBrowser.ServerApplication.csproj23
-rw-r--r--MediaBrowser.ServerApplication/packages.config1
-rw-r--r--MediaBrowser.UI.Controls/MediaBrowser.UI.Controls.csproj3
-rw-r--r--MediaBrowser.UI/App.xaml.cs96
-rw-r--r--MediaBrowser.UI/Controller/UIKernel.cs21
-rw-r--r--MediaBrowser.UI/MediaBrowser.UI.csproj13
-rw-r--r--MediaBrowser.UI/Playback/ExternalPlayer/GenericExternalPlayer.cs5
-rw-r--r--MediaBrowser.UI/Playback/NVlc/InternalMediaPlayerNVlc.cs5
-rw-r--r--MediaBrowser.UI/packages.config1
-rw-r--r--MediaBrowser.WebDashboard/Api/DashboardInfoWebSocketListener.cs13
-rw-r--r--MediaBrowser.WebDashboard/Api/DashboardService.cs24
-rw-r--r--MediaBrowser.WebDashboard/Html/css/images/mblogoblackfull.pngbin59905 -> 0 bytes
-rw-r--r--MediaBrowser.WebDashboard/Html/css/images/mblogoicon.pngbin0 -> 42128 bytes
-rw-r--r--MediaBrowser.WebDashboard/Html/css/images/mblogotextblack.pngbin0 -> 23382 bytes
-rw-r--r--MediaBrowser.WebDashboard/Html/css/images/mblogotextwhite.pngbin0 -> 23195 bytes
-rw-r--r--MediaBrowser.WebDashboard/Html/css/images/mblogowhitefull.pngbin59826 -> 0 bytes
-rw-r--r--MediaBrowser.WebDashboard/Html/css/site.css1713
-rw-r--r--MediaBrowser.WebDashboard/Html/login.html2
-rw-r--r--MediaBrowser.WebDashboard/Html/scripts/LoginPage.js26
-rw-r--r--MediaBrowser.WebDashboard/Html/scripts/PluginCatalogPage.js6
-rw-r--r--MediaBrowser.WebDashboard/Html/scripts/site.js2370
-rw-r--r--MediaBrowser.WebDashboard/MediaBrowser.WebDashboard.csproj827
-rw-r--r--Nuget/MediaBrowser.ApiClient.nuspec30
-rw-r--r--Nuget/MediaBrowser.Common.nuspec18
-rw-r--r--Nuget/MediaBrowser.Server.Core.nupkg.REMOVED.git-id1
-rw-r--r--Nuget/MediaBrowser.Server.Core.nuspec19
-rw-r--r--Nuget/MediaBrowser.Theater.Core.nuspec20
159 files changed, 3573 insertions, 3367 deletions
diff --git a/.gitignore b/.gitignore
index 3fbadb705..b68cb2bdf 100644
--- a/.gitignore
+++ b/.gitignore
@@ -32,6 +32,7 @@ local.properties
## Media Browser
#################
ProgramData*/
+CorePlugins*/
ProgramData-Server*/
ProgramData-UI*/
@@ -145,6 +146,7 @@ publish/
# NuGet Packages Directory
## TODO: If you have NuGet Package Restore enabled, uncomment the next line
packages/
+dlls/
# Windows Azure Build Output
csx
diff --git a/MediaBrowser.Api/Api.cs b/MediaBrowser.Api/Api.cs
new file mode 100644
index 000000000..fda9d1bd8
--- /dev/null
+++ b/MediaBrowser.Api/Api.cs
@@ -0,0 +1,12 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace MediaBrowser.Api
+{
+ class Api
+ {
+ }
+}
diff --git a/MediaBrowser.Api/EnvironmentService.cs b/MediaBrowser.Api/EnvironmentService.cs
index db768d0e8..83678c3f2 100644
--- a/MediaBrowser.Api/EnvironmentService.cs
+++ b/MediaBrowser.Api/EnvironmentService.cs
@@ -1,11 +1,9 @@
-using MediaBrowser.Common.IO;
-using MediaBrowser.Common.Net;
+using MediaBrowser.Common.Net;
using MediaBrowser.Controller.IO;
using MediaBrowser.Model.IO;
using ServiceStack.ServiceHost;
using System;
using System.Collections.Generic;
-using System.ComponentModel.Composition;
using System.Globalization;
using System.IO;
using System.Linq;
@@ -59,7 +57,6 @@ namespace MediaBrowser.Api
/// <summary>
/// Class EnvironmentService
/// </summary>
- [Export(typeof(IRestfulService))]
public class EnvironmentService : BaseRestService
{
/// <summary>
diff --git a/MediaBrowser.Api/HttpHandlers/PlaybackCheckInHandler.cs b/MediaBrowser.Api/HttpHandlers/PlaybackCheckInHandler.cs
index 7e0d27e49..9de3e2791 100644
--- a/MediaBrowser.Api/HttpHandlers/PlaybackCheckInHandler.cs
+++ b/MediaBrowser.Api/HttpHandlers/PlaybackCheckInHandler.cs
@@ -5,7 +5,6 @@ using MediaBrowser.Controller.Library;
using MediaBrowser.Model.Connectivity;
using MediaBrowser.Model.Dto;
using System;
-using System.ComponentModel.Composition;
using System.Threading.Tasks;
namespace MediaBrowser.Api.HttpHandlers
@@ -13,7 +12,6 @@ namespace MediaBrowser.Api.HttpHandlers
/// <summary>
/// Provides a handler to set played status for an item
/// </summary>
- [Export(typeof(IHttpServerHandler))]
public class PlaybackCheckInHandler : BaseSerializationHandler<Kernel, UserItemDataDto>
{
/// <summary>
diff --git a/MediaBrowser.Api/HttpHandlers/UpdateMediaLibraryHandler.cs b/MediaBrowser.Api/HttpHandlers/UpdateMediaLibraryHandler.cs
index e5c42008e..df6edd6f9 100644
--- a/MediaBrowser.Api/HttpHandlers/UpdateMediaLibraryHandler.cs
+++ b/MediaBrowser.Api/HttpHandlers/UpdateMediaLibraryHandler.cs
@@ -1,19 +1,17 @@
-using MediaBrowser.Common.IO;
-using MediaBrowser.Common.Net.Handlers;
+using MediaBrowser.Common.Net.Handlers;
using MediaBrowser.Controller;
using MediaBrowser.Controller.Entities;
using System;
-using System.ComponentModel.Composition;
using System.IO;
using System.Linq;
using System.Threading.Tasks;
+using MediaBrowser.Controller.IO;
namespace MediaBrowser.Api.HttpHandlers
{
/// <summary>
/// Makes changes to the user's media library
/// </summary>
- [Export(typeof(IHttpServerHandler))]
public class UpdateMediaLibraryHandler : BaseActionHandler<Kernel>
{
/// <summary>
diff --git a/MediaBrowser.Api/Images/ImageService.cs b/MediaBrowser.Api/Images/ImageService.cs
index 5e5888b3e..113bad083 100644
--- a/MediaBrowser.Api/Images/ImageService.cs
+++ b/MediaBrowser.Api/Images/ImageService.cs
@@ -6,7 +6,6 @@ using MediaBrowser.Controller.Library;
using MediaBrowser.Model.Entities;
using ServiceStack.ServiceHost;
using System;
-using System.ComponentModel.Composition;
using System.IO;
using System.Linq;
using System.Threading.Tasks;
@@ -114,7 +113,6 @@ namespace MediaBrowser.Api.Images
/// <summary>
/// Class ImageService
/// </summary>
- [Export(typeof(IRestfulService))]
public class ImageService : BaseRestService
{
/// <summary>
diff --git a/MediaBrowser.Api/Images/UploadImageHandler.cs b/MediaBrowser.Api/Images/UploadImageHandler.cs
index 13ea86563..758e96d85 100644
--- a/MediaBrowser.Api/Images/UploadImageHandler.cs
+++ b/MediaBrowser.Api/Images/UploadImageHandler.cs
@@ -5,7 +5,6 @@ using MediaBrowser.Controller.Entities;
using MediaBrowser.Controller.Library;
using MediaBrowser.Model.Entities;
using System;
-using System.ComponentModel.Composition;
using System.IO;
using System.Threading;
using System.Threading.Tasks;
@@ -15,7 +14,6 @@ namespace MediaBrowser.Api.Images
/// <summary>
/// Class UploadImageHandler
/// </summary>
- [Export(typeof(IHttpServerHandler))]
class UploadImageHandler : BaseActionHandler<Kernel>
{
/// <summary>
diff --git a/MediaBrowser.Api/LibraryService.cs b/MediaBrowser.Api/LibraryService.cs
index 585bfd45d..4ca073c10 100644
--- a/MediaBrowser.Api/LibraryService.cs
+++ b/MediaBrowser.Api/LibraryService.cs
@@ -1,5 +1,4 @@
-using MediaBrowser.Common.Mef;
-using MediaBrowser.Common.Net;
+using MediaBrowser.Common.Net;
using MediaBrowser.Controller;
using MediaBrowser.Controller.Entities;
using MediaBrowser.Controller.Library;
@@ -8,7 +7,6 @@ using MediaBrowser.Model.Entities;
using ServiceStack.ServiceHost;
using System;
using System.Collections.Generic;
-using System.ComponentModel.Composition;
using System.Linq;
namespace MediaBrowser.Api
@@ -97,7 +95,6 @@ namespace MediaBrowser.Api
/// <summary>
/// Class LibraryService
/// </summary>
- [Export(typeof(IRestfulService))]
public class LibraryService : BaseRestService
{
/// <summary>
@@ -213,7 +210,7 @@ namespace MediaBrowser.Api
{
var kernel = (Kernel)Kernel;
- var allTypes = kernel.Assemblies.SelectMany(MefUtils.GetTypes).Where(t => !t.IsAbstract && t.IsSubclassOf(typeof(BaseItem)));
+ var allTypes = kernel.AllTypes.Where(t => !t.IsAbstract && t.IsSubclassOf(typeof(BaseItem)));
if (request.HasInternetProvider)
{
diff --git a/MediaBrowser.Api/LocalizationService.cs b/MediaBrowser.Api/LocalizationService.cs
index ce9f175e3..098c9f72a 100644
--- a/MediaBrowser.Api/LocalizationService.cs
+++ b/MediaBrowser.Api/LocalizationService.cs
@@ -5,7 +5,6 @@ using MediaBrowser.Model.Globalization;
using MoreLinq;
using ServiceStack.ServiceHost;
using System.Collections.Generic;
-using System.ComponentModel.Composition;
using System.Globalization;
using System.Linq;
@@ -38,7 +37,6 @@ namespace MediaBrowser.Api
/// <summary>
/// Class CulturesService
/// </summary>
- [Export(typeof(IRestfulService))]
public class LocalizationService : BaseRestService
{
/// <summary>
diff --git a/MediaBrowser.Api/MediaBrowser.Api.csproj b/MediaBrowser.Api/MediaBrowser.Api.csproj
index 1d204cc7a..f6045ddd1 100644
--- a/MediaBrowser.Api/MediaBrowser.Api.csproj
+++ b/MediaBrowser.Api/MediaBrowser.Api.csproj
@@ -64,7 +64,6 @@
<HintPath>..\packages\ServiceStack.Text.3.9.37\lib\net35\ServiceStack.Text.dll</HintPath>
</Reference>
<Reference Include="System" />
- <Reference Include="System.ComponentModel.Composition" />
<Reference Include="System.Core" />
<Reference Include="System.Drawing" />
<Reference Include="System.Runtime.Serialization" />
diff --git a/MediaBrowser.Api/PackageService.cs b/MediaBrowser.Api/PackageService.cs
index 924c33937..028242e72 100644
--- a/MediaBrowser.Api/PackageService.cs
+++ b/MediaBrowser.Api/PackageService.cs
@@ -6,7 +6,6 @@ using MediaBrowser.Model.Updates;
using ServiceStack.ServiceHost;
using System;
using System.Collections.Generic;
-using System.ComponentModel.Composition;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
@@ -93,7 +92,6 @@ namespace MediaBrowser.Api
/// <summary>
/// Class PackageService
/// </summary>
- [Export(typeof(IRestfulService))]
public class PackageService : BaseRestService
{
/// <summary>
diff --git a/MediaBrowser.Api/Plugin.cs b/MediaBrowser.Api/Plugin.cs
index c9e1d7c95..58c0ffcfa 100644
--- a/MediaBrowser.Api/Plugin.cs
+++ b/MediaBrowser.Api/Plugin.cs
@@ -3,7 +3,6 @@ using MediaBrowser.Model.Plugins;
using System;
using System.Collections.Generic;
using System.ComponentModel;
-using System.ComponentModel.Composition;
using System.Diagnostics;
using System.Linq;
using System.Threading;
@@ -14,7 +13,6 @@ namespace MediaBrowser.Api
/// <summary>
/// Class Plugin
/// </summary>
- [Export(typeof(IPlugin))]
public class Plugin : BasePlugin<BasePluginConfiguration>
{
/// <summary>
diff --git a/MediaBrowser.Api/PluginService.cs b/MediaBrowser.Api/PluginService.cs
index 73bafd9fd..f982602bf 100644
--- a/MediaBrowser.Api/PluginService.cs
+++ b/MediaBrowser.Api/PluginService.cs
@@ -7,10 +7,8 @@ using MediaBrowser.Model.Plugins;
using ServiceStack.ServiceHost;
using System;
using System.Collections.Generic;
-using System.ComponentModel.Composition;
using System.IO;
using System.Linq;
-using System.Threading.Tasks;
using ServiceStack.Text.Controller;
namespace MediaBrowser.Api
@@ -119,7 +117,6 @@ namespace MediaBrowser.Api
/// <summary>
/// Class PluginsService
/// </summary>
- [Export(typeof(IRestfulService))]
public class PluginService : BaseRestService
{
/// <summary>
diff --git a/MediaBrowser.Api/ScheduledTasks/ScheduledTaskService.cs b/MediaBrowser.Api/ScheduledTasks/ScheduledTaskService.cs
index bd12454a0..1ca744542 100644
--- a/MediaBrowser.Api/ScheduledTasks/ScheduledTaskService.cs
+++ b/MediaBrowser.Api/ScheduledTasks/ScheduledTaskService.cs
@@ -6,7 +6,6 @@ using MediaBrowser.Model.Tasks;
using ServiceStack.ServiceHost;
using System;
using System.Collections.Generic;
-using System.ComponentModel.Composition;
using System.IO;
using System.Linq;
using ServiceStack.Text.Controller;
@@ -83,17 +82,27 @@ namespace MediaBrowser.Api.ScheduledTasks
/// <summary>
/// Class ScheduledTasksService
/// </summary>
- [Export(typeof(IRestfulService))]
public class ScheduledTaskService : BaseRestService
{
/// <summary>
+ /// Gets or sets the task manager.
+ /// </summary>
+ /// <value>The task manager.</value>
+ private ITaskManager TaskManager { get; set; }
+
+ public ScheduledTaskService(ITaskManager taskManager)
+ {
+ TaskManager = taskManager;
+ }
+
+ /// <summary>
/// Gets the specified request.
/// </summary>
/// <param name="request">The request.</param>
/// <returns>IEnumerable{TaskInfo}.</returns>
public object Get(GetScheduledTasks request)
{
- var result = Kernel.ScheduledTasks.OrderBy(i => i.Name)
+ var result = TaskManager.ScheduledTasks.OrderBy(i => i.Name)
.Select(ScheduledTaskHelpers.GetTaskInfo).ToList();
return ToOptimizedResult(result);
@@ -106,7 +115,7 @@ namespace MediaBrowser.Api.ScheduledTasks
/// <returns>IEnumerable{TaskInfo}.</returns>
public object Get(GetScheduledTask request)
{
- var task = Kernel.ScheduledTasks.FirstOrDefault(i => i.Id == request.Id);
+ var task = TaskManager.ScheduledTasks.FirstOrDefault(i => i.Id == request.Id);
if (task == null)
{
@@ -124,7 +133,7 @@ namespace MediaBrowser.Api.ScheduledTasks
/// <param name="request">The request.</param>
public void Post(StartScheduledTask request)
{
- var task = Kernel.ScheduledTasks.FirstOrDefault(i => i.Id == request.Id);
+ var task = TaskManager.ScheduledTasks.FirstOrDefault(i => i.Id == request.Id);
if (task == null)
{
@@ -140,7 +149,7 @@ namespace MediaBrowser.Api.ScheduledTasks
/// <param name="request">The request.</param>
public void Delete(StopScheduledTask request)
{
- var task = Kernel.ScheduledTasks.FirstOrDefault(i => i.Id == request.Id);
+ var task = TaskManager.ScheduledTasks.FirstOrDefault(i => i.Id == request.Id);
if (task == null)
{
@@ -160,8 +169,8 @@ namespace MediaBrowser.Api.ScheduledTasks
// https://code.google.com/p/servicestack/source/browse/trunk/Common/ServiceStack.Text/ServiceStack.Text/Controller/PathInfo.cs
var pathInfo = PathInfo.Parse(Request.PathInfo);
var id = new Guid(pathInfo.GetArgumentValue<string>(1));
-
- var task = Kernel.ScheduledTasks.FirstOrDefault(i => i.Id == id);
+
+ var task = TaskManager.ScheduledTasks.FirstOrDefault(i => i.Id == id);
if (task == null)
{
@@ -170,7 +179,7 @@ namespace MediaBrowser.Api.ScheduledTasks
var triggerInfos = JsonSerializer.DeserializeFromStream<TaskTriggerInfo[]>(request.RequestStream);
- task.Triggers = triggerInfos.Select(t => ScheduledTaskHelpers.GetTrigger(t, Kernel));
+ task.Triggers = triggerInfos.Select(ScheduledTaskHelpers.GetTrigger);
}
}
}
diff --git a/MediaBrowser.Api/ScheduledTasks/ScheduledTasksWebSocketListener.cs b/MediaBrowser.Api/ScheduledTasks/ScheduledTasksWebSocketListener.cs
index cb7863d84..72c23a0ef 100644
--- a/MediaBrowser.Api/ScheduledTasks/ScheduledTasksWebSocketListener.cs
+++ b/MediaBrowser.Api/ScheduledTasks/ScheduledTasksWebSocketListener.cs
@@ -1,10 +1,8 @@
using MediaBrowser.Common.Kernel;
using MediaBrowser.Common.ScheduledTasks;
-using MediaBrowser.Controller;
using MediaBrowser.Model.Logging;
using MediaBrowser.Model.Tasks;
using System.Collections.Generic;
-using System.ComponentModel.Composition;
using System.Linq;
using System.Threading.Tasks;
@@ -13,10 +11,15 @@ namespace MediaBrowser.Api.ScheduledTasks
/// <summary>
/// Class ScheduledTasksWebSocketListener
/// </summary>
- [Export(typeof(IWebSocketListener))]
public class ScheduledTasksWebSocketListener : BasePeriodicWebSocketListener<IEnumerable<TaskInfo>, object>
{
/// <summary>
+ /// Gets or sets the task manager.
+ /// </summary>
+ /// <value>The task manager.</value>
+ private ITaskManager TaskManager { get; set; }
+
+ /// <summary>
/// Gets the name.
/// </summary>
/// <value>The name.</value>
@@ -33,13 +36,12 @@ namespace MediaBrowser.Api.ScheduledTasks
/// <summary>
/// Initializes a new instance of the <see cref="ScheduledTasksWebSocketListener" /> class.
/// </summary>
- /// <param name="kernel">The kernel.</param>
/// <param name="logger">The logger.</param>
- [ImportingConstructor]
- public ScheduledTasksWebSocketListener([Import("kernel")] Kernel kernel, [Import("logger")] ILogger logger)
+ /// <param name="taskManager">The task manager.</param>
+ public ScheduledTasksWebSocketListener(ILogger logger, ITaskManager taskManager)
: base(logger)
{
- _kernel = kernel;
+ TaskManager = taskManager;
}
/// <summary>
@@ -49,7 +51,7 @@ namespace MediaBrowser.Api.ScheduledTasks
/// <returns>Task{IEnumerable{TaskInfo}}.</returns>
protected override Task<IEnumerable<TaskInfo>> GetDataToSend(object state)
{
- return Task.FromResult(_kernel.ScheduledTasks.OrderBy(i => i.Name)
+ return Task.FromResult(TaskManager.ScheduledTasks.OrderBy(i => i.Name)
.Select(ScheduledTaskHelpers.GetTaskInfo));
}
}
diff --git a/MediaBrowser.Api/Streaming/AudioHandler.cs b/MediaBrowser.Api/Streaming/AudioHandler.cs
index b7d5afbb9..2332f29d3 100644
--- a/MediaBrowser.Api/Streaming/AudioHandler.cs
+++ b/MediaBrowser.Api/Streaming/AudioHandler.cs
@@ -5,7 +5,6 @@ using MediaBrowser.Controller.Resolvers;
using MediaBrowser.Model.Dto;
using System;
using System.Collections.Generic;
-using System.ComponentModel.Composition;
using System.Linq;
using System.Net;
@@ -14,7 +13,6 @@ namespace MediaBrowser.Api.Streaming
/// <summary>
/// Providers a progressive streaming audio api
/// </summary>
- [Export(typeof(IHttpServerHandler))]
public class AudioHandler : BaseProgressiveStreamingHandler<Audio>
{
/// <summary>
diff --git a/MediaBrowser.Api/Streaming/BaseStreamingHandler.cs b/MediaBrowser.Api/Streaming/BaseStreamingHandler.cs
index d800a40fe..8c5fd34b1 100644
--- a/MediaBrowser.Api/Streaming/BaseStreamingHandler.cs
+++ b/MediaBrowser.Api/Streaming/BaseStreamingHandler.cs
@@ -859,11 +859,11 @@ namespace MediaBrowser.Api.Streaming
{
var video = LibraryItem as Video;
- if (video != null && video.VideoType == VideoType.Iso &&
- video.IsoType.HasValue && Kernel.IsoManager.CanMount(video.Path))
- {
- IsoMount = await Kernel.IsoManager.Mount(video.Path, CancellationToken.None).ConfigureAwait(false);
- }
+ //if (video != null && video.VideoType == VideoType.Iso &&
+ // video.IsoType.HasValue && Kernel.IsoManager.CanMount(video.Path))
+ //{
+ // IsoMount = await Kernel.IsoManager.Mount(video.Path, CancellationToken.None).ConfigureAwait(false);
+ //}
var process = new Process
{
diff --git a/MediaBrowser.Api/Streaming/HlsAudioPlaylistHandler.cs b/MediaBrowser.Api/Streaming/HlsAudioPlaylistHandler.cs
index 7aea163af..e9ae3a005 100644
--- a/MediaBrowser.Api/Streaming/HlsAudioPlaylistHandler.cs
+++ b/MediaBrowser.Api/Streaming/HlsAudioPlaylistHandler.cs
@@ -2,7 +2,6 @@
using MediaBrowser.Controller.Entities.Audio;
using MediaBrowser.Model.Dto;
using System;
-using System.ComponentModel.Composition;
using System.Net;
namespace MediaBrowser.Api.Streaming
@@ -10,7 +9,6 @@ namespace MediaBrowser.Api.Streaming
/// <summary>
/// Class HlsAudioPlaylistHandler
/// </summary>
- [Export(typeof(IHttpServerHandler))]
public class HlsAudioPlaylistHandler : BaseHlsPlaylistHandler<Audio>
{
/// <summary>
diff --git a/MediaBrowser.Api/Streaming/HlsSegmentHandler.cs b/MediaBrowser.Api/Streaming/HlsSegmentHandler.cs
index 5b022ab3d..4305fd8a7 100644
--- a/MediaBrowser.Api/Streaming/HlsSegmentHandler.cs
+++ b/MediaBrowser.Api/Streaming/HlsSegmentHandler.cs
@@ -1,7 +1,6 @@
using MediaBrowser.Common.Net.Handlers;
using MediaBrowser.Controller;
using System;
-using System.ComponentModel.Composition;
using System.IO;
using System.Net;
using System.Threading.Tasks;
@@ -11,7 +10,6 @@ namespace MediaBrowser.Api.Streaming
/// <summary>
/// Class HlsSegmentHandler
/// </summary>
- [Export(typeof(IHttpServerHandler))]
public class HlsSegmentHandler : BaseHandler<Kernel>
{
/// <summary>
diff --git a/MediaBrowser.Api/Streaming/HlsVideoPlaylistHandler.cs b/MediaBrowser.Api/Streaming/HlsVideoPlaylistHandler.cs
index 97a5b2ce6..70f825f02 100644
--- a/MediaBrowser.Api/Streaming/HlsVideoPlaylistHandler.cs
+++ b/MediaBrowser.Api/Streaming/HlsVideoPlaylistHandler.cs
@@ -1,7 +1,6 @@
using MediaBrowser.Common.Net.Handlers;
using MediaBrowser.Controller.Entities;
using System;
-using System.ComponentModel.Composition;
using System.Net;
namespace MediaBrowser.Api.Streaming
@@ -9,7 +8,6 @@ namespace MediaBrowser.Api.Streaming
/// <summary>
/// Class HlsVideoPlaylistHandler
/// </summary>
- [Export(typeof(IHttpServerHandler))]
public class HlsVideoPlaylistHandler : BaseHlsPlaylistHandler<Video>
{
/// <summary>
diff --git a/MediaBrowser.Api/Streaming/VideoHandler.cs b/MediaBrowser.Api/Streaming/VideoHandler.cs
index 4a05d2547..da60297f2 100644
--- a/MediaBrowser.Api/Streaming/VideoHandler.cs
+++ b/MediaBrowser.Api/Streaming/VideoHandler.cs
@@ -1,21 +1,15 @@
-using System.IO;
-using System.Threading;
-using MediaBrowser.Common.IO;
-using MediaBrowser.Common.Net.Handlers;
+using MediaBrowser.Common.IO;
using MediaBrowser.Controller.Entities;
using MediaBrowser.Controller.Resolvers;
using System;
-using System.ComponentModel.Composition;
using System.Linq;
using System.Net;
-using MediaBrowser.Model.Entities;
namespace MediaBrowser.Api.Streaming
{
/// <summary>
/// Providers a progressive streaming video api
/// </summary>
- [Export(typeof(IHttpServerHandler))]
class VideoHandler : BaseProgressiveStreamingHandler<Video>
{
/// <summary>
diff --git a/MediaBrowser.Api/SystemService.cs b/MediaBrowser.Api/SystemService.cs
index 9d15feb80..04632aa8e 100644
--- a/MediaBrowser.Api/SystemService.cs
+++ b/MediaBrowser.Api/SystemService.cs
@@ -5,7 +5,6 @@ using MediaBrowser.Controller;
using MediaBrowser.Model.Configuration;
using MediaBrowser.Model.System;
using ServiceStack.ServiceHost;
-using System.ComponentModel.Composition;
using System.IO;
using System.Threading.Tasks;
@@ -47,7 +46,6 @@ namespace MediaBrowser.Api
/// <summary>
/// Class SystemInfoService
/// </summary>
- [Export(typeof(IRestfulService))]
public class SystemService : BaseRestService
{
/// <summary>
diff --git a/MediaBrowser.Api/UserLibrary/GenresService.cs b/MediaBrowser.Api/UserLibrary/GenresService.cs
index ea97fea3e..5d72236fa 100644
--- a/MediaBrowser.Api/UserLibrary/GenresService.cs
+++ b/MediaBrowser.Api/UserLibrary/GenresService.cs
@@ -4,7 +4,6 @@ using MediaBrowser.Controller.Entities;
using ServiceStack.ServiceHost;
using System;
using System.Collections.Generic;
-using System.ComponentModel.Composition;
using System.Linq;
using System.Threading.Tasks;
@@ -22,7 +21,6 @@ namespace MediaBrowser.Api.UserLibrary
/// <summary>
/// Class GenresService
/// </summary>
- [Export(typeof(IRestfulService))]
public class GenresService : BaseItemsByNameService<Genre>
{
/// <summary>
diff --git a/MediaBrowser.Api/UserLibrary/ItemsService.cs b/MediaBrowser.Api/UserLibrary/ItemsService.cs
index 3cc503184..0586b2b5e 100644
--- a/MediaBrowser.Api/UserLibrary/ItemsService.cs
+++ b/MediaBrowser.Api/UserLibrary/ItemsService.cs
@@ -8,7 +8,6 @@ using MediaBrowser.Model.Entities;
using ServiceStack.ServiceHost;
using System;
using System.Collections.Generic;
-using System.ComponentModel.Composition;
using System.Linq;
using System.Threading.Tasks;
@@ -144,7 +143,6 @@ namespace MediaBrowser.Api.UserLibrary
/// <summary>
/// Class ItemsService
/// </summary>
- [Export(typeof(IRestfulService))]
public class ItemsService : BaseRestService
{
/// <summary>
diff --git a/MediaBrowser.Api/UserLibrary/PersonsService.cs b/MediaBrowser.Api/UserLibrary/PersonsService.cs
index 71dc32b32..181d511a6 100644
--- a/MediaBrowser.Api/UserLibrary/PersonsService.cs
+++ b/MediaBrowser.Api/UserLibrary/PersonsService.cs
@@ -4,7 +4,6 @@ using MediaBrowser.Controller.Entities;
using ServiceStack.ServiceHost;
using System;
using System.Collections.Generic;
-using System.ComponentModel.Composition;
using System.Linq;
using System.Threading.Tasks;
@@ -27,7 +26,6 @@ namespace MediaBrowser.Api.UserLibrary
/// <summary>
/// Class PersonsService
/// </summary>
- [Export(typeof(IRestfulService))]
public class PersonsService : BaseItemsByNameService<Person>
{
/// <summary>
diff --git a/MediaBrowser.Api/UserLibrary/StudiosService.cs b/MediaBrowser.Api/UserLibrary/StudiosService.cs
index da9106367..8b1824d83 100644
--- a/MediaBrowser.Api/UserLibrary/StudiosService.cs
+++ b/MediaBrowser.Api/UserLibrary/StudiosService.cs
@@ -1,10 +1,8 @@
-using MediaBrowser.Common.Net;
-using MediaBrowser.Controller;
+using MediaBrowser.Controller;
using MediaBrowser.Controller.Entities;
using ServiceStack.ServiceHost;
using System;
using System.Collections.Generic;
-using System.ComponentModel.Composition;
using System.Linq;
using System.Threading.Tasks;
@@ -22,7 +20,6 @@ namespace MediaBrowser.Api.UserLibrary
/// <summary>
/// Class StudiosService
/// </summary>
- [Export(typeof(IRestfulService))]
public class StudiosService : BaseItemsByNameService<Studio>
{
/// <summary>
diff --git a/MediaBrowser.Api/UserLibrary/UserLibraryService.cs b/MediaBrowser.Api/UserLibrary/UserLibraryService.cs
index 016b294ae..576ff8892 100644
--- a/MediaBrowser.Api/UserLibrary/UserLibraryService.cs
+++ b/MediaBrowser.Api/UserLibrary/UserLibraryService.cs
@@ -9,7 +9,6 @@ using MediaBrowser.Model.Entities;
using ServiceStack.ServiceHost;
using System;
using System.Collections.Generic;
-using System.ComponentModel.Composition;
using System.IO;
using System.Linq;
using System.Threading.Tasks;
@@ -252,7 +251,6 @@ namespace MediaBrowser.Api.UserLibrary
/// <summary>
/// Class UserLibraryService
/// </summary>
- [Export(typeof(IRestfulService))]
public class UserLibraryService : BaseRestService
{
public object Get(GetSpecialFeatures request)
diff --git a/MediaBrowser.Api/UserLibrary/YearsService.cs b/MediaBrowser.Api/UserLibrary/YearsService.cs
index c3ea11420..14fa645af 100644
--- a/MediaBrowser.Api/UserLibrary/YearsService.cs
+++ b/MediaBrowser.Api/UserLibrary/YearsService.cs
@@ -4,7 +4,6 @@ using MediaBrowser.Controller.Entities;
using ServiceStack.ServiceHost;
using System;
using System.Collections.Generic;
-using System.ComponentModel.Composition;
using System.Globalization;
using System.Linq;
using System.Threading.Tasks;
@@ -23,7 +22,6 @@ namespace MediaBrowser.Api.UserLibrary
/// <summary>
/// Class YearsService
/// </summary>
- [Export(typeof(IRestfulService))]
public class YearsService : BaseItemsByNameService<Year>
{
/// <summary>
diff --git a/MediaBrowser.Api/UserService.cs b/MediaBrowser.Api/UserService.cs
index c4703a7a0..c76479d19 100644
--- a/MediaBrowser.Api/UserService.cs
+++ b/MediaBrowser.Api/UserService.cs
@@ -7,7 +7,6 @@ using MediaBrowser.Model.Dto;
using ServiceStack.ServiceHost;
using System;
using System.Collections.Generic;
-using System.ComponentModel.Composition;
using System.IO;
using System.Linq;
using System.Threading.Tasks;
@@ -134,7 +133,6 @@ namespace MediaBrowser.Api
/// <summary>
/// Class UsersService
/// </summary>
- [Export(typeof(IRestfulService))]
public class UserService : BaseRestService
{
/// <summary>
diff --git a/MediaBrowser.Api/WeatherService.cs b/MediaBrowser.Api/WeatherService.cs
index 0c04f5ec0..c79c2da28 100644
--- a/MediaBrowser.Api/WeatherService.cs
+++ b/MediaBrowser.Api/WeatherService.cs
@@ -2,7 +2,6 @@
using MediaBrowser.Controller;
using MediaBrowser.Model.Weather;
using ServiceStack.ServiceHost;
-using System.ComponentModel.Composition;
using System.Linq;
using System.Threading;
@@ -24,7 +23,6 @@ namespace MediaBrowser.Api
/// <summary>
/// Class WeatherService
/// </summary>
- [Export(typeof(IRestfulService))]
public class WeatherService : BaseRestService
{
/// <summary>
diff --git a/MediaBrowser.Api/WebSocket/LogFileWebSocketListener.cs b/MediaBrowser.Api/WebSocket/LogFileWebSocketListener.cs
index 144997c73..6e3e10361 100644
--- a/MediaBrowser.Api/WebSocket/LogFileWebSocketListener.cs
+++ b/MediaBrowser.Api/WebSocket/LogFileWebSocketListener.cs
@@ -4,7 +4,6 @@ using MediaBrowser.Controller;
using MediaBrowser.Model.Logging;
using System;
using System.Collections.Generic;
-using System.ComponentModel.Composition;
using System.IO;
using System.Linq;
using System.Threading.Tasks;
@@ -14,7 +13,6 @@ namespace MediaBrowser.Api.WebSocket
/// <summary>
/// Class ScheduledTasksWebSocketListener
/// </summary>
- [Export(typeof(IWebSocketListener))]
public class LogFileWebSocketListener : BasePeriodicWebSocketListener<IEnumerable<string>, LogFileWebSocketState>
{
/// <summary>
@@ -36,8 +34,7 @@ namespace MediaBrowser.Api.WebSocket
/// </summary>
/// <param name="logger">The logger.</param>
/// <param name="kernel">The kernel.</param>
- [ImportingConstructor]
- public LogFileWebSocketListener([Import("logger")] ILogger logger, [Import("kernel")] Kernel kernel)
+ public LogFileWebSocketListener(ILogger logger, Kernel kernel)
: base(logger)
{
_kernel = kernel;
diff --git a/MediaBrowser.Api/WebSocket/SystemInfoWebSocketListener.cs b/MediaBrowser.Api/WebSocket/SystemInfoWebSocketListener.cs
index c41714581..40c3f2f24 100644
--- a/MediaBrowser.Api/WebSocket/SystemInfoWebSocketListener.cs
+++ b/MediaBrowser.Api/WebSocket/SystemInfoWebSocketListener.cs
@@ -2,7 +2,6 @@
using MediaBrowser.Controller;
using MediaBrowser.Model.Logging;
using MediaBrowser.Model.System;
-using System.ComponentModel.Composition;
using System.Threading.Tasks;
namespace MediaBrowser.Api.WebSocket
@@ -10,7 +9,6 @@ namespace MediaBrowser.Api.WebSocket
/// <summary>
/// Class SystemInfoWebSocketListener
/// </summary>
- [Export(typeof(IWebSocketListener))]
public class SystemInfoWebSocketListener : BasePeriodicWebSocketListener<SystemInfo, object>
{
/// <summary>
@@ -32,8 +30,7 @@ namespace MediaBrowser.Api.WebSocket
/// </summary>
/// <param name="kernel">The kernel.</param>
/// <param name="logger">The logger.</param>
- [ImportingConstructor]
- public SystemInfoWebSocketListener([Import("kernel")] Kernel kernel, [Import("logger")] ILogger logger)
+ public SystemInfoWebSocketListener(Kernel kernel, ILogger logger)
: base(logger)
{
_kernel = kernel;
diff --git a/MediaBrowser.ApiInteraction.Javascript/JavascriptApiClientService.cs b/MediaBrowser.ApiInteraction.Javascript/JavascriptApiClientService.cs
index b94b8e071..c03146e69 100644
--- a/MediaBrowser.ApiInteraction.Javascript/JavascriptApiClientService.cs
+++ b/MediaBrowser.ApiInteraction.Javascript/JavascriptApiClientService.cs
@@ -2,7 +2,6 @@
using MediaBrowser.Common.Net;
using ServiceStack.ServiceHost;
using System;
-using System.ComponentModel.Composition;
using System.IO;
using System.Threading.Tasks;
@@ -25,7 +24,6 @@ namespace MediaBrowser.ApiInteraction.Javascript
/// <summary>
/// Class JavascriptApiClientService
/// </summary>
- [Export(typeof(IRestfulService))]
public class JavascriptApiClientService : BaseRestService
{
/// <summary>
diff --git a/MediaBrowser.ApiInteraction.Javascript/MediaBrowser.ApiInteraction.Javascript.csproj b/MediaBrowser.ApiInteraction.Javascript/MediaBrowser.ApiInteraction.Javascript.csproj
index dde00e984..3e8ed6c38 100644
--- a/MediaBrowser.ApiInteraction.Javascript/MediaBrowser.ApiInteraction.Javascript.csproj
+++ b/MediaBrowser.ApiInteraction.Javascript/MediaBrowser.ApiInteraction.Javascript.csproj
@@ -68,7 +68,6 @@
<HintPath>..\packages\ServiceStack.Text.3.9.37\lib\net35\ServiceStack.Text.dll</HintPath>
</Reference>
<Reference Include="System" />
- <Reference Include="System.ComponentModel.Composition" />
<Reference Include="System.Core" />
<Reference Include="System.Xml.Linq" />
<Reference Include="System.Data.DataSetExtensions" />
diff --git a/MediaBrowser.ApiInteraction.Portable/MediaBrowser.ApiInteraction.Portable.csproj b/MediaBrowser.ApiInteraction.Portable/MediaBrowser.ApiInteraction.Portable.csproj
index 2b6b0b123..973066307 100644
--- a/MediaBrowser.ApiInteraction.Portable/MediaBrowser.ApiInteraction.Portable.csproj
+++ b/MediaBrowser.ApiInteraction.Portable/MediaBrowser.ApiInteraction.Portable.csproj
@@ -98,6 +98,9 @@
<Import Project="$(MSBuildExtensionsPath32)\Microsoft\Portable\$(TargetFrameworkVersion)\Microsoft.Portable.CSharp.targets" />
<Import Project="$(SolutionDir)\.nuget\nuget.targets" />
<Import Project="..\packages\Microsoft.Bcl.Build.1.0.0-rc\tools\Microsoft.Bcl.Build.targets" />
+ <PropertyGroup>
+ <PostBuildEvent>xcopy "$(TargetPath)" "$(SolutionDir)\Nuget\dlls\" /y /d /r /i</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">
diff --git a/MediaBrowser.ApiInteraction/ApiClient.cs b/MediaBrowser.ApiInteraction/ApiClient.cs
index ef8197e16..4f701532b 100644
--- a/MediaBrowser.ApiInteraction/ApiClient.cs
+++ b/MediaBrowser.ApiInteraction/ApiClient.cs
@@ -656,7 +656,7 @@ namespace MediaBrowser.ApiInteraction
/// </summary>
/// <param name="itemId">The item id.</param>
/// <param name="userId">The user id.</param>
- /// <returns>Task{DtoUserItemData}.</returns>
+ /// <returns>Task{UserItemDataDto}.</returns>
/// <exception cref="System.ArgumentNullException">itemId</exception>
public Task<UserItemDataDto> ReportPlaybackStartAsync(string itemId, Guid userId)
{
@@ -686,7 +686,7 @@ namespace MediaBrowser.ApiInteraction
/// <param name="itemId">The item id.</param>
/// <param name="userId">The user id.</param>
/// <param name="positionTicks">The position ticks.</param>
- /// <returns>Task{DtoUserItemData}.</returns>
+ /// <returns>Task{UserItemDataDto}.</returns>
/// <exception cref="System.ArgumentNullException">itemId</exception>
public Task<UserItemDataDto> ReportPlaybackProgressAsync(string itemId, Guid userId, long? positionTicks)
{
@@ -718,7 +718,7 @@ namespace MediaBrowser.ApiInteraction
/// <param name="itemId">The item id.</param>
/// <param name="userId">The user id.</param>
/// <param name="positionTicks">The position ticks.</param>
- /// <returns>Task{DtoUserItemData}.</returns>
+ /// <returns>Task{UserItemDataDto}.</returns>
/// <exception cref="System.ArgumentNullException">itemId</exception>
public Task<UserItemDataDto> ReportPlaybackStoppedAsync(string itemId, Guid userId, long? positionTicks)
{
@@ -749,7 +749,7 @@ namespace MediaBrowser.ApiInteraction
/// </summary>
/// <param name="itemId">The item id.</param>
/// <param name="userId">The user id.</param>
- /// <returns>Task{DtoUserItemData}.</returns>
+ /// <returns>Task{UserItemDataDto}.</returns>
/// <exception cref="System.ArgumentNullException">itemId</exception>
public Task ClearUserItemRatingAsync(string itemId, Guid userId)
{
@@ -774,7 +774,7 @@ namespace MediaBrowser.ApiInteraction
/// <param name="itemId">The item id.</param>
/// <param name="userId">The user id.</param>
/// <param name="likes">if set to <c>true</c> [likes].</param>
- /// <returns>Task{DtoUserItemData}.</returns>
+ /// <returns>Task{UserItemDataDto}.</returns>
/// <exception cref="System.ArgumentNullException">itemId</exception>
public Task<UserItemDataDto> UpdateUserItemRatingAsync(string itemId, Guid userId, bool likes)
{
diff --git a/MediaBrowser.ApiInteraction/MediaBrowser.ApiInteraction.csproj b/MediaBrowser.ApiInteraction/MediaBrowser.ApiInteraction.csproj
index f3a25e897..0d9938891 100644
--- a/MediaBrowser.ApiInteraction/MediaBrowser.ApiInteraction.csproj
+++ b/MediaBrowser.ApiInteraction/MediaBrowser.ApiInteraction.csproj
@@ -75,6 +75,9 @@
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<Import Project="$(SolutionDir)\.nuget\nuget.targets" />
+ <PropertyGroup>
+ <PostBuildEvent>xcopy "$(TargetPath)" "$(SolutionDir)\Nuget\dlls\" /y /d /r /i</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">
diff --git a/MediaBrowser.Common/Kernel/BaseKernel.cs b/MediaBrowser.Common/Kernel/BaseKernel.cs
index 2b3986408..2b9550496 100644
--- a/MediaBrowser.Common/Kernel/BaseKernel.cs
+++ b/MediaBrowser.Common/Kernel/BaseKernel.cs
@@ -1,7 +1,5 @@
using MediaBrowser.Common.Events;
using MediaBrowser.Common.IO;
-using MediaBrowser.Common.Localization;
-using MediaBrowser.Common.Mef;
using MediaBrowser.Common.Net;
using MediaBrowser.Common.Plugins;
using MediaBrowser.Common.ScheduledTasks;
@@ -11,8 +9,6 @@ using MediaBrowser.Model.Logging;
using MediaBrowser.Model.System;
using System;
using System.Collections.Generic;
-using System.ComponentModel.Composition;
-using System.ComponentModel.Composition.Hosting;
using System.Diagnostics;
using System.IO;
using System.Linq;
@@ -183,37 +179,15 @@ namespace MediaBrowser.Common.Kernel
/// Gets the list of currently loaded plugins
/// </summary>
/// <value>The plugins.</value>
- [ImportMany(typeof(IPlugin))]
public IEnumerable<IPlugin> Plugins { get; protected set; }
/// <summary>
- /// Gets the list of Scheduled Tasks
- /// </summary>
- /// <value>The scheduled tasks.</value>
- [ImportMany(typeof(IScheduledTask))]
- public IEnumerable<IScheduledTask> ScheduledTasks { get; private set; }
-
- /// <summary>
/// Gets the web socket listeners.
/// </summary>
/// <value>The web socket listeners.</value>
- [ImportMany(typeof(IWebSocketListener))]
public IEnumerable<IWebSocketListener> WebSocketListeners { get; private set; }
/// <summary>
- /// Gets the list of Localized string files
- /// </summary>
- /// <value>The string files.</value>
- [ImportMany(typeof(LocalizedStringData))]
- public IEnumerable<LocalizedStringData> StringFiles { get; private set; }
-
- /// <summary>
- /// Gets the MEF CompositionContainer
- /// </summary>
- /// <value>The composition container.</value>
- private CompositionContainer CompositionContainer { get; set; }
-
- /// <summary>
/// The _HTTP manager
/// </summary>
/// <value>The HTTP manager.</value>
@@ -226,25 +200,17 @@ namespace MediaBrowser.Common.Kernel
public TcpManager TcpManager { get; private set; }
/// <summary>
- /// Gets the task manager.
- /// </summary>
- /// <value>The task manager.</value>
- public TaskManager TaskManager { get; private set; }
-
- /// <summary>
- /// Gets the iso manager.
- /// </summary>
- /// <value>The iso manager.</value>
- public IIsoManager IsoManager { get; private set; }
-
- /// <summary>
/// Gets the rest services.
/// </summary>
/// <value>The rest services.</value>
- [ImportMany(typeof(IRestfulService))]
public IEnumerable<IRestfulService> RestServices { get; private set; }
/// <summary>
+ /// The disposable parts
+ /// </summary>
+ private readonly List<IDisposable> _disposableParts = new List<IDisposable>();
+
+ /// <summary>
/// The _protobuf serializer initialized
/// </summary>
private bool _protobufSerializerInitialized;
@@ -265,7 +231,7 @@ namespace MediaBrowser.Common.Kernel
get
{
// Lazy load
- LazyInitializer.EnsureInitialized(ref _protobufSerializer, ref _protobufSerializerInitialized, ref _protobufSerializerSyncLock, () => DynamicProtobufSerializer.Create(Assemblies));
+ LazyInitializer.EnsureInitialized(ref _protobufSerializer, ref _protobufSerializerInitialized, ref _protobufSerializerSyncLock, () => DynamicProtobufSerializer.Create(AllTypes));
return _protobufSerializer;
}
private set
@@ -336,29 +302,35 @@ namespace MediaBrowser.Common.Kernel
protected IApplicationHost ApplicationHost { get; private set; }
/// <summary>
+ /// Gets or sets the task manager.
+ /// </summary>
+ /// <value>The task manager.</value>
+ protected ITaskManager TaskManager { get; set; }
+
+ /// <summary>
/// Gets the assemblies.
/// </summary>
/// <value>The assemblies.</value>
- public Assembly[] Assemblies { get; private set; }
+ protected Assembly[] Assemblies { get; private set; }
+
+ /// <summary>
+ /// Gets all types.
+ /// </summary>
+ /// <value>All types.</value>
+ public Type[] AllTypes { get; private set; }
/// <summary>
/// Initializes a new instance of the <see cref="BaseKernel{TApplicationPathsType}" /> class.
/// </summary>
/// <param name="appHost">The app host.</param>
- /// <param name="isoManager">The iso manager.</param>
/// <param name="logger">The logger.</param>
/// <exception cref="System.ArgumentNullException">isoManager</exception>
- protected BaseKernel(IApplicationHost appHost, IIsoManager isoManager, ILogger logger)
+ protected BaseKernel(IApplicationHost appHost, ILogger logger)
{
if (appHost == null)
{
throw new ArgumentNullException("appHost");
}
-
- if (isoManager == null)
- {
- throw new ArgumentNullException("isoManager");
- }
if (logger == null)
{
@@ -366,7 +338,6 @@ namespace MediaBrowser.Common.Kernel
}
ApplicationHost = appHost;
- IsoManager = isoManager;
Logger = logger;
}
@@ -419,7 +390,7 @@ namespace MediaBrowser.Common.Kernel
await OnConfigurationLoaded().ConfigureAwait(false);
DisposeTaskManager();
- TaskManager = new TaskManager(this, Logger);
+ TaskManager = new TaskManager(Logger);
Logger.Info("Loading Plugins");
await ReloadComposableParts().ConfigureAwait(false);
@@ -460,25 +431,82 @@ namespace MediaBrowser.Common.Kernel
Assemblies = GetComposablePartAssemblies().ToArray();
- CompositionContainer = MefUtils.GetSafeCompositionContainer(Assemblies.Select(i => new AssemblyCatalog(i)));
-
- ComposeExportedValues(CompositionContainer);
+ AllTypes = Assemblies.SelectMany(GetTypes).ToArray();
- CompositionContainer.ComposeParts(this);
+ ComposeParts(AllTypes);
await OnComposablePartsLoaded().ConfigureAwait(false);
+ }
+
+ /// <summary>
+ /// Composes the parts.
+ /// </summary>
+ /// <param name="allTypes">All types.</param>
+ private void ComposeParts(IEnumerable<Type> allTypes)
+ {
+ var concreteTypes = allTypes.Where(t => t.IsClass && !t.IsAbstract && !t.IsInterface && !t.IsGenericType).ToArray();
+
+ RegisterExportedValues();
+
+ FindParts(concreteTypes);
+ }
+
+ /// <summary>
+ /// Composes the parts with ioc container.
+ /// </summary>
+ /// <param name="allTypes">All types.</param>
+ protected virtual void FindParts(Type[] allTypes)
+ {
+ RestServices = GetExports<IRestfulService>(allTypes);
+ WebSocketListeners = GetExports<IWebSocketListener>(allTypes);
+ Plugins = GetExports<IPlugin>(allTypes);
+
+ var tasks = GetExports<IScheduledTask>(allTypes, false);
+
+ TaskManager.AddTasks(tasks);
+ }
+
+ /// <summary>
+ /// Gets the exports.
+ /// </summary>
+ /// <typeparam name="T"></typeparam>
+ /// <param name="allTypes">All types.</param>
+ /// <param name="manageLiftime">if set to <c>true</c> [manage liftime].</param>
+ /// <returns>IEnumerable{``0}.</returns>
+ protected IEnumerable<T> GetExports<T>(Type[] allTypes, bool manageLiftime = true)
+ {
+ var currentType = typeof(T);
+
+ Logger.Info("Composing instances of " + currentType.Name);
- CompositionContainer.Catalog.Dispose();
+ var parts = allTypes.Where(currentType.IsAssignableFrom).Select(Instantiate).Cast<T>().ToArray();
+
+ if (manageLiftime)
+ {
+ _disposableParts.AddRange(parts.OfType<IDisposable>());
+ }
+
+ return parts;
+ }
+
+ /// <summary>
+ /// Instantiates the specified type.
+ /// </summary>
+ /// <param name="type">The type.</param>
+ /// <returns>System.Object.</returns>
+ private object Instantiate(Type type)
+ {
+ return ApplicationHost.CreateInstance(type);
}
/// <summary>
/// Composes the exported values.
/// </summary>
/// <param name="container">The container.</param>
- protected virtual void ComposeExportedValues(CompositionContainer container)
+ protected virtual void RegisterExportedValues()
{
- container.ComposeExportedValue("logger", Logger);
- container.ComposeExportedValue("appHost", ApplicationHost);
+ ApplicationHost.Register<IKernel>(this);
+ ApplicationHost.Register(TaskManager);
}
/// <summary>
@@ -546,6 +574,31 @@ namespace MediaBrowser.Common.Kernel
}
/// <summary>
+ /// Gets a list of types within an assembly
+ /// This will handle situations that would normally throw an exception - such as a type within the assembly that depends on some other non-existant reference
+ /// </summary>
+ /// <param name="assembly">The assembly.</param>
+ /// <returns>IEnumerable{Type}.</returns>
+ /// <exception cref="System.ArgumentNullException">assembly</exception>
+ private static IEnumerable<Type> GetTypes(Assembly assembly)
+ {
+ if (assembly == null)
+ {
+ throw new ArgumentNullException("assembly");
+ }
+
+ try
+ {
+ return assembly.GetTypes();
+ }
+ catch (ReflectionTypeLoadException ex)
+ {
+ // If it fails we can still get a list of the Types it was able to resolve
+ return ex.Types.Where(t => t != null);
+ }
+ }
+
+ /// <summary>
/// Fires after MEF finishes finding composable parts within plugin assemblies
/// </summary>
/// <returns>Task.</returns>
@@ -553,11 +606,6 @@ namespace MediaBrowser.Common.Kernel
{
return Task.Run(() =>
{
- foreach (var task in ScheduledTasks)
- {
- task.Initialize(this, Logger);
- }
-
// Start-up each plugin
Parallel.ForEach(Plugins, plugin =>
{
@@ -608,22 +656,11 @@ namespace MediaBrowser.Common.Kernel
{
DisposeTcpManager();
DisposeTaskManager();
- DisposeIsoManager();
DisposeHttpManager();
DisposeComposableParts();
- }
- }
- /// <summary>
- /// Disposes the iso manager.
- /// </summary>
- private void DisposeIsoManager()
- {
- if (IsoManager != null)
- {
- IsoManager.Dispose();
- IsoManager = null;
+ _disposableParts.Clear();
}
}
@@ -668,9 +705,9 @@ namespace MediaBrowser.Common.Kernel
/// </summary>
protected virtual void DisposeComposableParts()
{
- if (CompositionContainer != null)
+ foreach (var part in _disposableParts)
{
- CompositionContainer.Dispose();
+ part.Dispose();
}
}
diff --git a/MediaBrowser.Common/Kernel/IApplicationHost.cs b/MediaBrowser.Common/Kernel/IApplicationHost.cs
index 63c63eb3d..ae2e71667 100644
--- a/MediaBrowser.Common/Kernel/IApplicationHost.cs
+++ b/MediaBrowser.Common/Kernel/IApplicationHost.cs
@@ -43,5 +43,33 @@ namespace MediaBrowser.Common.Kernel
/// </summary>
/// <returns>Task.</returns>
Task UpdateApplication(CancellationToken cancellationToken, IProgress<double> progress);
+
+ /// <summary>
+ /// Creates an instance of type and resolves all constructor dependancies
+ /// </summary>
+ /// <param name="type">The type.</param>
+ /// <returns>System.Object.</returns>
+ object CreateInstance(Type type);
+
+ /// <summary>
+ /// Registers a service that other classes can use as a dependancy.
+ /// </summary>
+ /// <typeparam name="T"></typeparam>
+ /// <param name="obj">The obj.</param>
+ void Register<T>(T obj) where T : class;
+
+ /// <summary>
+ /// Resolves this instance.
+ /// </summary>
+ /// <typeparam name="T"></typeparam>
+ /// <returns>``0.</returns>
+ T Resolve<T>();
+
+ /// <summary>
+ /// Resolves this instance.
+ /// </summary>
+ /// <typeparam name="T"></typeparam>
+ /// <returns>``0.</returns>
+ T TryResolve<T>();
}
}
diff --git a/MediaBrowser.Common/Kernel/IKernel.cs b/MediaBrowser.Common/Kernel/IKernel.cs
index c0e650fc7..1685f1f64 100644
--- a/MediaBrowser.Common/Kernel/IKernel.cs
+++ b/MediaBrowser.Common/Kernel/IKernel.cs
@@ -1,12 +1,10 @@
using MediaBrowser.Common.Net;
using MediaBrowser.Common.Plugins;
-using MediaBrowser.Common.ScheduledTasks;
using MediaBrowser.Common.Serialization;
using MediaBrowser.Model.Configuration;
using MediaBrowser.Model.System;
using System;
using System.Collections.Generic;
-using System.Reflection;
using System.Threading.Tasks;
namespace MediaBrowser.Common.Kernel
@@ -70,12 +68,6 @@ namespace MediaBrowser.Common.Kernel
SystemInfo GetSystemInfo();
/// <summary>
- /// Gets the scheduled tasks.
- /// </summary>
- /// <value>The scheduled tasks.</value>
- IEnumerable<IScheduledTask> ScheduledTasks { get; }
-
- /// <summary>
/// Reloads the logger.
/// </summary>
void ReloadLogger();
@@ -134,12 +126,6 @@ namespace MediaBrowser.Common.Kernel
TcpManager TcpManager { get; }
/// <summary>
- /// Gets the task manager.
- /// </summary>
- /// <value>The task manager.</value>
- TaskManager TaskManager { get; }
-
- /// <summary>
/// Gets the web socket listeners.
/// </summary>
/// <value>The web socket listeners.</value>
@@ -161,12 +147,6 @@ namespace MediaBrowser.Common.Kernel
event EventHandler<EventArgs> ConfigurationUpdated;
/// <summary>
- /// Gets the assemblies.
- /// </summary>
- /// <value>The assemblies.</value>
- Assembly[] Assemblies { get; }
-
- /// <summary>
/// Gets the rest services.
/// </summary>
/// <value>The rest services.</value>
diff --git a/MediaBrowser.Common/MediaBrowser.Common.csproj b/MediaBrowser.Common/MediaBrowser.Common.csproj
index 0f0c58f17..6542ab81d 100644
--- a/MediaBrowser.Common/MediaBrowser.Common.csproj
+++ b/MediaBrowser.Common/MediaBrowser.Common.csproj
@@ -41,9 +41,6 @@
<Reference Include="Alchemy">
<HintPath>..\packages\Alchemy.2.2.1\lib\net40\Alchemy.dll</HintPath>
</Reference>
- <Reference Include="MoreLinq">
- <HintPath>..\packages\morelinq.1.0.15631-beta\lib\net35\MoreLinq.dll</HintPath>
- </Reference>
<Reference Include="NLog">
<HintPath>..\packages\NLog.2.0.0.2000\lib\net40\NLog.dll</HintPath>
</Reference>
@@ -92,7 +89,6 @@
<HintPath>..\packages\ServiceStack.Text.3.9.37\lib\net35\ServiceStack.Text.dll</HintPath>
</Reference>
<Reference Include="System" />
- <Reference Include="System.ComponentModel.Composition" />
<Reference Include="System.Configuration" />
<Reference Include="System.Core" />
<Reference Include="System.Management" />
@@ -128,7 +124,6 @@
<Compile Include="Events\GenericEventArgs.cs" />
<Compile Include="Extensions\NamedLock.cs" />
<Compile Include="Extensions\ResourceNotFoundException.cs" />
- <Compile Include="IO\FileSystem.cs" />
<Compile Include="IO\FileSystemRepository.cs" />
<Compile Include="IO\IIsoManager.cs" />
<Compile Include="IO\IIsoMount.cs" />
@@ -141,8 +136,6 @@
<Compile Include="Kernel\IApplicationHost.cs" />
<Compile Include="Kernel\IKernel.cs" />
<Compile Include="Kernel\TcpManager.cs" />
- <Compile Include="Localization\LocalizedStringData.cs" />
- <Compile Include="Mef\MefUtils.cs" />
<Compile Include="Net\AlchemyWebSocket.cs" />
<Compile Include="Net\BaseRestService.cs" />
<Compile Include="Net\Handlers\BaseActionHandler.cs" />
@@ -150,6 +143,7 @@
<Compile Include="Net\Handlers\StaticFileHandler.cs" />
<Compile Include="Net\HttpManager.cs" />
<Compile Include="Net\IRestfulService.cs" />
+ <Compile Include="Net\IUdpServer.cs" />
<Compile Include="Net\IWebSocket.cs" />
<Compile Include="Net\MimeTypes.cs" />
<Compile Include="Net\NativeWebSocket.cs" />
@@ -165,6 +159,7 @@
<DesignTime>True</DesignTime>
<DependentUpon>Resources.resx</DependentUpon>
</Compile>
+ <Compile Include="ScheduledTasks\ITaskManager.cs" />
<Compile Include="ScheduledTasks\TaskManager.cs" />
<Compile Include="ScheduledTasks\Tasks\ReloadLoggerTask.cs" />
<Compile Include="ScheduledTasks\ScheduledTaskHelpers.cs" />
@@ -229,6 +224,9 @@
<ItemGroup />
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<Import Project="$(SolutionDir)\.nuget\nuget.targets" />
+ <PropertyGroup>
+ <PostBuildEvent>xcopy "$(TargetPath)" "$(SolutionDir)\Nuget\dlls\" /y /d /r /i</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">
diff --git a/MediaBrowser.Common/Mef/MefUtils.cs b/MediaBrowser.Common/Mef/MefUtils.cs
deleted file mode 100644
index 744f6cd80..000000000
--- a/MediaBrowser.Common/Mef/MefUtils.cs
+++ /dev/null
@@ -1,80 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.ComponentModel.Composition.Hosting;
-using System.ComponentModel.Composition.Primitives;
-using System.Linq;
-using System.Reflection;
-
-namespace MediaBrowser.Common.Mef
-{
- /// <summary>
- /// Class MefUtils
- /// </summary>
- public static class MefUtils
- {
- /// <summary>
- /// Plugins that live on both the server and UI are going to have references to assemblies from both sides.
- /// But looks for Parts on one side, it will throw an exception when it seems Types from the other side that it doesn't have a reference to.
- /// For example, a plugin provides a Resolver. When MEF runs in the UI, it will throw an exception when it sees the resolver because there won't be a reference to the base class.
- /// This method will catch those exceptions while retining the list of Types that MEF is able to resolve.
- /// </summary>
- /// <param name="catalogs">The catalogs.</param>
- /// <returns>CompositionContainer.</returns>
- /// <exception cref="System.ArgumentNullException">catalogs</exception>
- public static CompositionContainer GetSafeCompositionContainer(IEnumerable<ComposablePartCatalog> catalogs)
- {
- if (catalogs == null)
- {
- throw new ArgumentNullException("catalogs");
- }
-
- var newList = new List<ComposablePartCatalog>();
-
- // Go through each Catalog
- foreach (var catalog in catalogs)
- {
- try
- {
- // Try to have MEF find Parts
- catalog.Parts.ToArray();
-
- // If it succeeds we can use the entire catalog
- newList.Add(catalog);
- }
- catch (ReflectionTypeLoadException ex)
- {
- // If it fails we can still get a list of the Types it was able to resolve and create TypeCatalogs
- var typeCatalogs = ex.Types.Where(t => t != null).Select(t => new TypeCatalog(t));
- newList.AddRange(typeCatalogs);
- }
- }
-
- return new CompositionContainer(new AggregateCatalog(newList));
- }
-
- /// <summary>
- /// Gets a list of types within an assembly
- /// This will handle situations that would normally throw an exception - such as a type within the assembly that depends on some other non-existant reference
- /// </summary>
- /// <param name="assembly">The assembly.</param>
- /// <returns>IEnumerable{Type}.</returns>
- /// <exception cref="System.ArgumentNullException">assembly</exception>
- public static IEnumerable<Type> GetTypes(Assembly assembly)
- {
- if (assembly == null)
- {
- throw new ArgumentNullException("assembly");
- }
-
- try
- {
- return assembly.GetTypes();
- }
- catch (ReflectionTypeLoadException ex)
- {
- // If it fails we can still get a list of the Types it was able to resolve
- return ex.Types.Where(t => t != null);
- }
- }
- }
-}
diff --git a/MediaBrowser.Common/Net/HttpServer.cs b/MediaBrowser.Common/Net/HttpServer.cs
index b09c95da0..20ee615ad 100644
--- a/MediaBrowser.Common/Net/HttpServer.cs
+++ b/MediaBrowser.Common/Net/HttpServer.cs
@@ -4,6 +4,7 @@ using MediaBrowser.Common.Kernel;
using MediaBrowser.Model.Logging;
using ServiceStack.Api.Swagger;
using ServiceStack.Common.Web;
+using ServiceStack.Configuration;
using ServiceStack.Logging.NLogger;
using ServiceStack.ServiceHost;
using ServiceStack.ServiceInterface.Cors;
@@ -153,6 +154,8 @@ namespace MediaBrowser.Common.Net
DebugMode = true
});
}
+
+ container.Adapter = new ContainerAdapter(ApplicationHost);
container.Register(Kernel);
container.Register(_logger);
@@ -464,4 +467,23 @@ namespace MediaBrowser.Common.Net
/// <value>The endpoint.</value>
public IPEndPoint Endpoint { get; set; }
}
+
+ class ContainerAdapter : IContainerAdapter
+ {
+ private readonly IApplicationHost _appHost;
+
+ public ContainerAdapter(IApplicationHost appHost)
+ {
+ _appHost = appHost;
+ }
+ public T Resolve<T>()
+ {
+ return _appHost.Resolve<T>();
+ }
+
+ public T TryResolve<T>()
+ {
+ return _appHost.TryResolve<T>();
+ }
+ }
} \ No newline at end of file
diff --git a/MediaBrowser.Common/Net/IUdpServer.cs b/MediaBrowser.Common/Net/IUdpServer.cs
new file mode 100644
index 000000000..01a8ef021
--- /dev/null
+++ b/MediaBrowser.Common/Net/IUdpServer.cs
@@ -0,0 +1,7 @@
+
+namespace MediaBrowser.Common.Net
+{
+ public interface IUdpServer
+ {
+ }
+}
diff --git a/MediaBrowser.Common/ScheduledTasks/BaseScheduledTask.cs b/MediaBrowser.Common/ScheduledTasks/BaseScheduledTask.cs
index 395c73a84..845faf31a 100644
--- a/MediaBrowser.Common/ScheduledTasks/BaseScheduledTask.cs
+++ b/MediaBrowser.Common/ScheduledTasks/BaseScheduledTask.cs
@@ -17,7 +17,7 @@ namespace MediaBrowser.Common.ScheduledTasks
/// </summary>
/// <typeparam name="TKernelType">The type of the T kernel type.</typeparam>
public abstract class BaseScheduledTask<TKernelType> : IScheduledTask
- where TKernelType : IKernel
+ where TKernelType : class, IKernel
{
/// <summary>
/// Gets the kernel.
@@ -26,6 +26,47 @@ namespace MediaBrowser.Common.ScheduledTasks
protected TKernelType Kernel { get; private set; }
/// <summary>
+ /// Gets the logger.
+ /// </summary>
+ /// <value>The logger.</value>
+ protected ILogger Logger { get; private set; }
+
+ /// <summary>
+ /// Gets the task manager.
+ /// </summary>
+ /// <value>The task manager.</value>
+ protected ITaskManager TaskManager { get; private set; }
+
+ /// <summary>
+ /// Initializes a new instance of the <see cref="BaseScheduledTask{TKernelType}" /> class.
+ /// </summary>
+ /// <param name="kernel">The kernel.</param>
+ /// <param name="taskManager">The task manager.</param>
+ /// <param name="logger">The logger.</param>
+ /// <exception cref="System.ArgumentNullException">kernel</exception>
+ protected BaseScheduledTask(TKernelType kernel, ITaskManager taskManager, ILogger logger)
+ {
+ if (kernel == null)
+ {
+ throw new ArgumentNullException("kernel");
+ }
+ if (taskManager == null)
+ {
+ throw new ArgumentNullException("taskManager");
+ }
+ if (logger == null)
+ {
+ throw new ArgumentNullException("logger");
+ }
+
+ Kernel = kernel;
+ TaskManager = taskManager;
+ Logger = logger;
+
+ ReloadTriggerEvents(true);
+ }
+
+ /// <summary>
/// The _last execution result
/// </summary>
private TaskResult _lastExecutionResult;
@@ -199,7 +240,7 @@ namespace MediaBrowser.Common.ScheduledTasks
try
{
return JsonSerializer.DeserializeFromFile<IEnumerable<TaskTriggerInfo>>(ConfigurationFilePath)
- .Select(t => ScheduledTaskHelpers.GetTrigger(t, Kernel))
+ .Select(ScheduledTaskHelpers.GetTrigger)
.ToList();
}
catch (IOException)
@@ -228,7 +269,7 @@ namespace MediaBrowser.Common.ScheduledTasks
_triggersInitialized = true;
- ReloadTriggerEvents();
+ ReloadTriggerEvents(false);
JsonSerializer.SerializeToFile(_triggers.Select(ScheduledTaskHelpers.GetTriggerInfo), ConfigurationFilePath);
}
@@ -291,28 +332,10 @@ namespace MediaBrowser.Common.ScheduledTasks
}
/// <summary>
- /// Gets the logger.
- /// </summary>
- /// <value>The logger.</value>
- protected ILogger Logger { get; private set; }
-
- /// <summary>
- /// Initializes the specified kernel.
- /// </summary>
- /// <param name="kernel">The kernel.</param>
- /// <param name="logger">The logger.</param>
- public void Initialize(IKernel kernel, ILogger logger)
- {
- Logger = logger;
-
- Kernel = (TKernelType)kernel;
- ReloadTriggerEvents();
- }
-
- /// <summary>
/// Reloads the trigger events.
/// </summary>
- private void ReloadTriggerEvents()
+ /// <param name="isApplicationStartup">if set to <c>true</c> [is application startup].</param>
+ private void ReloadTriggerEvents(bool isApplicationStartup)
{
foreach (var trigger in Triggers)
{
@@ -320,7 +343,7 @@ namespace MediaBrowser.Common.ScheduledTasks
trigger.Triggered -= trigger_Triggered;
trigger.Triggered += trigger_Triggered;
- trigger.Start();
+ trigger.Start(isApplicationStartup);
}
}
@@ -335,7 +358,7 @@ namespace MediaBrowser.Common.ScheduledTasks
Logger.Info("{0} fired for task: {1}", trigger.GetType().Name, Name);
- Kernel.TaskManager.QueueScheduledTask(this);
+ TaskManager.QueueScheduledTask(this);
}
/// <summary>
@@ -392,7 +415,7 @@ namespace MediaBrowser.Common.ScheduledTasks
CurrentCancellationTokenSource = null;
CurrentProgress = null;
- Kernel.TaskManager.OnTaskCompleted(this);
+ TaskManager.OnTaskCompleted(this);
}
/// <summary>
diff --git a/MediaBrowser.Common/ScheduledTasks/BaseTaskTrigger.cs b/MediaBrowser.Common/ScheduledTasks/BaseTaskTrigger.cs
index 5e60bb718..ed302ed39 100644
--- a/MediaBrowser.Common/ScheduledTasks/BaseTaskTrigger.cs
+++ b/MediaBrowser.Common/ScheduledTasks/BaseTaskTrigger.cs
@@ -27,13 +27,13 @@ namespace MediaBrowser.Common.ScheduledTasks
await Task.Delay(1000).ConfigureAwait(false);
- Start();
+ Start(false);
}
/// <summary>
/// Stars waiting for the trigger action
/// </summary>
- protected internal abstract void Start();
+ protected internal abstract void Start(bool isApplicationStartup);
/// <summary>
/// Stops waiting for the trigger action
diff --git a/MediaBrowser.Common/ScheduledTasks/DailyTrigger.cs b/MediaBrowser.Common/ScheduledTasks/DailyTrigger.cs
index c1cf1a9a3..fb749f77c 100644
--- a/MediaBrowser.Common/ScheduledTasks/DailyTrigger.cs
+++ b/MediaBrowser.Common/ScheduledTasks/DailyTrigger.cs
@@ -23,7 +23,8 @@ namespace MediaBrowser.Common.ScheduledTasks
/// <summary>
/// Stars waiting for the trigger action
/// </summary>
- protected internal override void Start()
+ /// <param name="isApplicationStartup">if set to <c>true</c> [is application startup].</param>
+ protected internal override void Start(bool isApplicationStartup)
{
DisposeTimer();
diff --git a/MediaBrowser.Common/ScheduledTasks/IScheduledTask.cs b/MediaBrowser.Common/ScheduledTasks/IScheduledTask.cs
index 95d1edf63..cba5fc5d0 100644
--- a/MediaBrowser.Common/ScheduledTasks/IScheduledTask.cs
+++ b/MediaBrowser.Common/ScheduledTasks/IScheduledTask.cs
@@ -1,6 +1,4 @@
-using MediaBrowser.Common.Kernel;
-using MediaBrowser.Model.Logging;
-using MediaBrowser.Model.Tasks;
+using MediaBrowser.Model.Tasks;
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
@@ -74,13 +72,6 @@ namespace MediaBrowser.Common.ScheduledTasks
void Cancel();
/// <summary>
- /// Initializes the specified kernel.
- /// </summary>
- /// <param name="kernel">The kernel.</param>
- /// <param name="logger">The logger.</param>
- void Initialize(IKernel kernel, ILogger logger);
-
- /// <summary>
/// Cancels if running.
/// </summary>
void CancelIfRunning();
diff --git a/MediaBrowser.Common/ScheduledTasks/ITaskManager.cs b/MediaBrowser.Common/ScheduledTasks/ITaskManager.cs
new file mode 100644
index 000000000..430208869
--- /dev/null
+++ b/MediaBrowser.Common/ScheduledTasks/ITaskManager.cs
@@ -0,0 +1,46 @@
+using System;
+using System.Collections.Generic;
+
+namespace MediaBrowser.Common.ScheduledTasks
+{
+ public interface ITaskManager : IDisposable
+ {
+ /// <summary>
+ /// Gets the list of Scheduled Tasks
+ /// </summary>
+ /// <value>The scheduled tasks.</value>
+ IScheduledTask[] ScheduledTasks { get; }
+
+ /// <summary>
+ /// Cancels if running and queue.
+ /// </summary>
+ /// <typeparam name="T"></typeparam>
+ void CancelIfRunningAndQueue<T>()
+ where T : IScheduledTask;
+
+ /// <summary>
+ /// Queues the scheduled task.
+ /// </summary>
+ /// <typeparam name="T"></typeparam>
+ void QueueScheduledTask<T>()
+ where T : IScheduledTask;
+
+ /// <summary>
+ /// Queues the scheduled task.
+ /// </summary>
+ /// <param name="task">The task.</param>
+ void QueueScheduledTask(IScheduledTask task);
+
+ /// <summary>
+ /// Adds the tasks.
+ /// </summary>
+ /// <param name="tasks">The tasks.</param>
+ void AddTasks(IEnumerable<IScheduledTask> tasks);
+
+ /// <summary>
+ /// Called when [task completed].
+ /// </summary>
+ /// <param name="task">The task.</param>
+ void OnTaskCompleted(IScheduledTask task);
+ }
+} \ No newline at end of file
diff --git a/MediaBrowser.Common/ScheduledTasks/IntervalTrigger.cs b/MediaBrowser.Common/ScheduledTasks/IntervalTrigger.cs
index 1ead484c8..759447b10 100644
--- a/MediaBrowser.Common/ScheduledTasks/IntervalTrigger.cs
+++ b/MediaBrowser.Common/ScheduledTasks/IntervalTrigger.cs
@@ -23,7 +23,8 @@ namespace MediaBrowser.Common.ScheduledTasks
/// <summary>
/// Stars waiting for the trigger action
/// </summary>
- protected internal override void Start()
+ /// <param name="isApplicationStartup">if set to <c>true</c> [is application startup].</param>
+ protected internal override void Start(bool isApplicationStartup)
{
DisposeTimer();
diff --git a/MediaBrowser.Common/ScheduledTasks/ScheduledTaskHelpers.cs b/MediaBrowser.Common/ScheduledTasks/ScheduledTaskHelpers.cs
index 95c4c6a66..9942da17f 100644
--- a/MediaBrowser.Common/ScheduledTasks/ScheduledTaskHelpers.cs
+++ b/MediaBrowser.Common/ScheduledTasks/ScheduledTaskHelpers.cs
@@ -78,11 +78,10 @@ namespace MediaBrowser.Common.ScheduledTasks
/// Converts a TaskTriggerInfo into a concrete BaseTaskTrigger
/// </summary>
/// <param name="info">The info.</param>
- /// <param name="kernel">The kernel.</param>
/// <returns>BaseTaskTrigger.</returns>
/// <exception cref="System.ArgumentNullException"></exception>
/// <exception cref="System.ArgumentException">Invalid trigger type: + info.Type</exception>
- public static BaseTaskTrigger GetTrigger(TaskTriggerInfo info, IKernel kernel)
+ public static BaseTaskTrigger GetTrigger(TaskTriggerInfo info)
{
if (info.Type.Equals(typeof(DailyTrigger).Name, StringComparison.OrdinalIgnoreCase))
{
@@ -144,7 +143,7 @@ namespace MediaBrowser.Common.ScheduledTasks
if (info.Type.Equals(typeof(StartupTrigger).Name, StringComparison.OrdinalIgnoreCase))
{
- return new StartupTrigger(kernel);
+ return new StartupTrigger();
}
throw new ArgumentException("Unrecognized trigger type: " + info.Type);
diff --git a/MediaBrowser.Common/ScheduledTasks/StartupTrigger.cs b/MediaBrowser.Common/ScheduledTasks/StartupTrigger.cs
index 84775924f..a254d2be9 100644
--- a/MediaBrowser.Common/ScheduledTasks/StartupTrigger.cs
+++ b/MediaBrowser.Common/ScheduledTasks/StartupTrigger.cs
@@ -1,6 +1,4 @@
-using MediaBrowser.Common.Kernel;
-using System;
-using System.Threading.Tasks;
+using System.Threading.Tasks;
namespace MediaBrowser.Common.ScheduledTasks
{
@@ -10,33 +8,17 @@ namespace MediaBrowser.Common.ScheduledTasks
public class StartupTrigger : BaseTaskTrigger
{
/// <summary>
- /// Gets the kernel.
- /// </summary>
- /// <value>The kernel.</value>
- protected IKernel Kernel { get; private set; }
-
- /// <summary>
- /// Initializes a new instance of the <see cref="StartupTrigger" /> class.
- /// </summary>
- /// <param name="kernel">The kernel.</param>
- public StartupTrigger(IKernel kernel)
- {
- Kernel = kernel;
- }
-
- /// <summary>
/// Stars waiting for the trigger action
/// </summary>
- protected internal override void Start()
- {
- Kernel.ReloadCompleted += Kernel_ReloadCompleted;
- }
-
- async void Kernel_ReloadCompleted(object sender, EventArgs e)
+ /// <param name="isApplicationStartup">if set to <c>true</c> [is application startup].</param>
+ protected internal async override void Start(bool isApplicationStartup)
{
- await Task.Delay(2000).ConfigureAwait(false);
+ if (isApplicationStartup)
+ {
+ await Task.Delay(2000).ConfigureAwait(false);
- OnTriggered();
+ OnTriggered();
+ }
}
/// <summary>
@@ -44,7 +26,6 @@ namespace MediaBrowser.Common.ScheduledTasks
/// </summary>
protected internal override void Stop()
{
- Kernel.ReloadCompleted -= Kernel_ReloadCompleted;
}
}
}
diff --git a/MediaBrowser.Common/ScheduledTasks/SystemEventTrigger.cs b/MediaBrowser.Common/ScheduledTasks/SystemEventTrigger.cs
index 3075a8587..45d1fae8e 100644
--- a/MediaBrowser.Common/ScheduledTasks/SystemEventTrigger.cs
+++ b/MediaBrowser.Common/ScheduledTasks/SystemEventTrigger.cs
@@ -18,7 +18,8 @@ namespace MediaBrowser.Common.ScheduledTasks
/// <summary>
/// Stars waiting for the trigger action
/// </summary>
- protected internal override void Start()
+ /// <param name="isApplicationStartup">if set to <c>true</c> [is application startup].</param>
+ protected internal override void Start(bool isApplicationStartup)
{
switch (SystemEvent)
{
diff --git a/MediaBrowser.Common/ScheduledTasks/TaskManager.cs b/MediaBrowser.Common/ScheduledTasks/TaskManager.cs
index b71ab8161..946c42d2e 100644
--- a/MediaBrowser.Common/ScheduledTasks/TaskManager.cs
+++ b/MediaBrowser.Common/ScheduledTasks/TaskManager.cs
@@ -1,5 +1,4 @@
-using MediaBrowser.Common.Kernel;
-using MediaBrowser.Model.Logging;
+using MediaBrowser.Model.Logging;
using MediaBrowser.Model.Tasks;
using System;
using System.Collections.Generic;
@@ -10,9 +9,15 @@ namespace MediaBrowser.Common.ScheduledTasks
/// <summary>
/// Class TaskManager
/// </summary>
- public class TaskManager : BaseManager<IKernel>
+ internal class TaskManager : ITaskManager
{
/// <summary>
+ /// Gets the list of Scheduled Tasks
+ /// </summary>
+ /// <value>The scheduled tasks.</value>
+ public IScheduledTask[] ScheduledTasks { get; private set; }
+
+ /// <summary>
/// The _task queue
/// </summary>
private readonly List<Type> _taskQueue = new List<Type>();
@@ -25,12 +30,17 @@ namespace MediaBrowser.Common.ScheduledTasks
/// <summary>
/// Initializes a new instance of the <see cref="TaskManager" /> class.
/// </summary>
- /// <param name="kernel">The kernel.</param>
/// <param name="logger">The logger.</param>
- public TaskManager(IKernel kernel, ILogger logger)
- : base(kernel)
+ public TaskManager(ILogger logger)
{
+ if (logger == null)
+ {
+ throw new ArgumentException("logger");
+ }
+
_logger = logger;
+
+ ScheduledTasks = new IScheduledTask[] {};
}
/// <summary>
@@ -40,7 +50,7 @@ namespace MediaBrowser.Common.ScheduledTasks
public void CancelIfRunningAndQueue<T>()
where T : IScheduledTask
{
- Kernel.ScheduledTasks.OfType<T>().First().CancelIfRunning();
+ ScheduledTasks.OfType<T>().First().CancelIfRunning();
QueueScheduledTask<T>();
}
@@ -51,7 +61,7 @@ namespace MediaBrowser.Common.ScheduledTasks
public void QueueScheduledTask<T>()
where T : IScheduledTask
{
- var scheduledTask = Kernel.ScheduledTasks.OfType<T>().First();
+ var scheduledTask = ScheduledTasks.OfType<T>().First();
QueueScheduledTask(scheduledTask);
}
@@ -64,7 +74,7 @@ namespace MediaBrowser.Common.ScheduledTasks
{
var type = task.GetType();
- var scheduledTask = Kernel.ScheduledTasks.First(t => t.GetType() == type);
+ var scheduledTask = ScheduledTasks.First(t => t.GetType() == type);
lock (_taskQueue)
{
@@ -91,7 +101,7 @@ namespace MediaBrowser.Common.ScheduledTasks
/// Called when [task completed].
/// </summary>
/// <param name="task">The task.</param>
- internal void OnTaskCompleted(IScheduledTask task)
+ public void OnTaskCompleted(IScheduledTask task)
{
// Execute queued tasks
lock (_taskQueue)
@@ -100,7 +110,7 @@ namespace MediaBrowser.Common.ScheduledTasks
foreach (var type in copy)
{
- var scheduledTask = Kernel.ScheduledTasks.First(t => t.GetType() == type);
+ var scheduledTask = ScheduledTasks.First(t => t.GetType() == type);
if (scheduledTask.State == TaskState.Idle)
{
@@ -111,5 +121,39 @@ namespace MediaBrowser.Common.ScheduledTasks
}
}
}
+
+ /// <summary>
+ /// Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources.
+ /// </summary>
+ public void Dispose()
+ {
+ Dispose(true);
+ GC.SuppressFinalize(this);
+ }
+
+ /// <summary>
+ /// Releases unmanaged and - optionally - managed resources.
+ /// </summary>
+ /// <param name="dispose"><c>true</c> to release both managed and unmanaged resources; <c>false</c> to release only unmanaged resources.</param>
+ protected virtual void Dispose(bool dispose)
+ {
+ foreach (var task in ScheduledTasks)
+ {
+ task.Dispose();
+ }
+ }
+
+ /// <summary>
+ /// Adds the tasks.
+ /// </summary>
+ /// <param name="tasks">The tasks.</param>
+ public void AddTasks(IEnumerable<IScheduledTask> tasks)
+ {
+ var myTasks = ScheduledTasks.ToList();
+
+ myTasks.AddRange(tasks);
+
+ ScheduledTasks = myTasks.ToArray();
+ }
}
}
diff --git a/MediaBrowser.Common/ScheduledTasks/Tasks/DeleteCacheFileTask.cs b/MediaBrowser.Common/ScheduledTasks/Tasks/DeleteCacheFileTask.cs
index 2a9bc4a0d..b06134ee2 100644
--- a/MediaBrowser.Common/ScheduledTasks/Tasks/DeleteCacheFileTask.cs
+++ b/MediaBrowser.Common/ScheduledTasks/Tasks/DeleteCacheFileTask.cs
@@ -1,8 +1,7 @@
using MediaBrowser.Common.Kernel;
-using MediaBrowser.Model.Tasks;
+using MediaBrowser.Model.Logging;
using System;
using System.Collections.Generic;
-using System.ComponentModel.Composition;
using System.IO;
using System.Linq;
using System.Threading;
@@ -13,10 +12,20 @@ namespace MediaBrowser.Common.ScheduledTasks.Tasks
/// <summary>
/// Deletes old cache files
/// </summary>
- [Export(typeof(IScheduledTask))]
public class DeleteCacheFileTask : BaseScheduledTask<IKernel>
{
/// <summary>
+ /// Initializes a new instance of the <see cref="DeleteCacheFileTask" /> class.
+ /// </summary>
+ /// <param name="kernel">The kernel.</param>
+ /// <param name="taskManager">The task manager.</param>
+ /// <param name="logger">The logger.</param>
+ public DeleteCacheFileTask(IKernel kernel, ITaskManager taskManager, ILogger logger)
+ : base(kernel, taskManager, logger)
+ {
+ }
+
+ /// <summary>
/// Creates the triggers that define when the task will run
/// </summary>
/// <returns>IEnumerable{BaseTaskTrigger}.</returns>
diff --git a/MediaBrowser.Common/ScheduledTasks/Tasks/DeleteLogFileTask.cs b/MediaBrowser.Common/ScheduledTasks/Tasks/DeleteLogFileTask.cs
index a1068a263..0b243cb10 100644
--- a/MediaBrowser.Common/ScheduledTasks/Tasks/DeleteLogFileTask.cs
+++ b/MediaBrowser.Common/ScheduledTasks/Tasks/DeleteLogFileTask.cs
@@ -1,8 +1,7 @@
using MediaBrowser.Common.Kernel;
-using MediaBrowser.Model.Tasks;
+using MediaBrowser.Model.Logging;
using System;
using System.Collections.Generic;
-using System.ComponentModel.Composition;
using System.IO;
using System.Linq;
using System.Threading;
@@ -13,10 +12,20 @@ namespace MediaBrowser.Common.ScheduledTasks.Tasks
/// <summary>
/// Deletes old log files
/// </summary>
- [Export(typeof(IScheduledTask))]
public class DeleteLogFileTask : BaseScheduledTask<IKernel>
{
/// <summary>
+ /// Initializes a new instance of the <see cref="DeleteLogFileTask" /> class.
+ /// </summary>
+ /// <param name="kernel">The kernel.</param>
+ /// <param name="taskManager">The task manager.</param>
+ /// <param name="logger">The logger.</param>
+ public DeleteLogFileTask(IKernel kernel, ITaskManager taskManager, ILogger logger)
+ : base(kernel, taskManager, logger)
+ {
+ }
+
+ /// <summary>
/// Creates the triggers that define when the task will run
/// </summary>
/// <returns>IEnumerable{BaseTaskTrigger}.</returns>
diff --git a/MediaBrowser.Common/ScheduledTasks/Tasks/ReloadLoggerTask.cs b/MediaBrowser.Common/ScheduledTasks/Tasks/ReloadLoggerTask.cs
index a4f06f205..35cbe98f1 100644
--- a/MediaBrowser.Common/ScheduledTasks/Tasks/ReloadLoggerTask.cs
+++ b/MediaBrowser.Common/ScheduledTasks/Tasks/ReloadLoggerTask.cs
@@ -1,8 +1,7 @@
using MediaBrowser.Common.Kernel;
-using MediaBrowser.Model.Tasks;
+using MediaBrowser.Model.Logging;
using System;
using System.Collections.Generic;
-using System.ComponentModel.Composition;
using System.Threading;
using System.Threading.Tasks;
@@ -11,10 +10,20 @@ namespace MediaBrowser.Common.ScheduledTasks.Tasks
/// <summary>
/// Class ReloadLoggerFileTask
/// </summary>
- [Export(typeof(IScheduledTask))]
public class ReloadLoggerFileTask : BaseScheduledTask<IKernel>
{
/// <summary>
+ /// Initializes a new instance of the <see cref="ReloadLoggerFileTask" /> class.
+ /// </summary>
+ /// <param name="kernel">The kernel.</param>
+ /// <param name="taskManager">The task manager.</param>
+ /// <param name="logger">The logger.</param>
+ public ReloadLoggerFileTask(IKernel kernel, ITaskManager taskManager, ILogger logger)
+ : base(kernel, taskManager, logger)
+ {
+ }
+
+ /// <summary>
/// Gets the default triggers.
/// </summary>
/// <returns>IEnumerable{BaseTaskTrigger}.</returns>
diff --git a/MediaBrowser.Common/ScheduledTasks/Tasks/SystemUpdateTask.cs b/MediaBrowser.Common/ScheduledTasks/Tasks/SystemUpdateTask.cs
index f9950424f..f02293a5e 100644
--- a/MediaBrowser.Common/ScheduledTasks/Tasks/SystemUpdateTask.cs
+++ b/MediaBrowser.Common/ScheduledTasks/Tasks/SystemUpdateTask.cs
@@ -1,7 +1,7 @@
using MediaBrowser.Common.Kernel;
+using MediaBrowser.Model.Logging;
using System;
using System.Collections.Generic;
-using System.ComponentModel.Composition;
using System.Threading;
using System.Threading.Tasks;
@@ -10,7 +10,6 @@ namespace MediaBrowser.Common.ScheduledTasks.Tasks
/// <summary>
/// Plugin Update Task
/// </summary>
- [Export(typeof(IScheduledTask))]
public class SystemUpdateTask : BaseScheduledTask<IKernel>
{
/// <summary>
@@ -22,8 +21,11 @@ namespace MediaBrowser.Common.ScheduledTasks.Tasks
/// Initializes a new instance of the <see cref="SystemUpdateTask" /> class.
/// </summary>
/// <param name="appHost">The app host.</param>
- [ImportingConstructor]
- public SystemUpdateTask([Import("appHost")] IApplicationHost appHost)
+ /// <param name="taskManager">The task manager.</param>
+ /// <param name="kernel">The kernel.</param>
+ /// <param name="logger">The logger.</param>
+ public SystemUpdateTask(IApplicationHost appHost, ITaskManager taskManager, IKernel kernel, ILogger logger)
+ : base(kernel, taskManager, logger)
{
_appHost = appHost;
}
diff --git a/MediaBrowser.Common/ScheduledTasks/WeeklyTrigger.cs b/MediaBrowser.Common/ScheduledTasks/WeeklyTrigger.cs
index 136dc8b13..afeacc2b3 100644
--- a/MediaBrowser.Common/ScheduledTasks/WeeklyTrigger.cs
+++ b/MediaBrowser.Common/ScheduledTasks/WeeklyTrigger.cs
@@ -29,7 +29,8 @@ namespace MediaBrowser.Common.ScheduledTasks
/// <summary>
/// Stars waiting for the trigger action
/// </summary>
- protected internal override void Start()
+ /// <param name="isApplicationStartup">if set to <c>true</c> [is application startup].</param>
+ protected internal override void Start(bool isApplicationStartup)
{
DisposeTimer();
diff --git a/MediaBrowser.Common/Serialization/DynamicProtobufSerializer.cs b/MediaBrowser.Common/Serialization/DynamicProtobufSerializer.cs
index f83b31322..359cf9da0 100644
--- a/MediaBrowser.Common/Serialization/DynamicProtobufSerializer.cs
+++ b/MediaBrowser.Common/Serialization/DynamicProtobufSerializer.cs
@@ -1,11 +1,9 @@
-using MediaBrowser.Common.Mef;
-using ProtoBuf;
+using ProtoBuf;
using ProtoBuf.Meta;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
-using System.Reflection;
namespace MediaBrowser.Common.Serialization
{
@@ -135,21 +133,20 @@ namespace MediaBrowser.Common.Serialization
/// <summary>
/// Creates the specified assemblies.
/// </summary>
- /// <param name="assemblies">The assemblies.</param>
/// <returns>DynamicProtobufSerializer.</returns>
/// <exception cref="System.ArgumentNullException">assemblies</exception>
- public static DynamicProtobufSerializer Create(IEnumerable<Assembly> assemblies)
+ public static DynamicProtobufSerializer Create(IEnumerable<Type> types)
{
- if (assemblies == null)
+ if (types == null)
{
- throw new ArgumentNullException("assemblies");
+ throw new ArgumentNullException("types");
}
var model = TypeModel.Create();
var attributeType = typeof(ProtoContractAttribute);
// Find all ProtoContracts in the current assembly
- foreach (var type in assemblies.SelectMany(a => MefUtils.GetTypes(a).Where(t => Attribute.IsDefined(t, attributeType))))
+ foreach (var type in types.Where(t => Attribute.IsDefined(t, attributeType)))
{
model.Add(type, true);
}
diff --git a/MediaBrowser.Common/packages.config b/MediaBrowser.Common/packages.config
index 4ac80b285..536640094 100644
--- a/MediaBrowser.Common/packages.config
+++ b/MediaBrowser.Common/packages.config
@@ -1,7 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<packages>
<package id="Alchemy" version="2.2.1" targetFramework="net45" />
- <package id="morelinq" version="1.0.15631-beta" targetFramework="net45" />
<package id="NLog" version="2.0.0.2000" targetFramework="net45" />
<package id="protobuf-net" version="2.0.0.621" targetFramework="net45" />
<package id="Rx-Core" version="2.0.21114" targetFramework="net45" />
diff --git a/MediaBrowser.Controller/Drawing/ImageManager.cs b/MediaBrowser.Controller/Drawing/ImageManager.cs
index 16fd4a5b8..a0ba9d550 100644
--- a/MediaBrowser.Controller/Drawing/ImageManager.cs
+++ b/MediaBrowser.Controller/Drawing/ImageManager.cs
@@ -541,7 +541,7 @@ namespace MediaBrowser.Controller.Drawing
/// <param name="imageType">Type of the image.</param>
/// <returns>Guid.</returns>
/// <exception cref="System.ArgumentNullException">item</exception>
- public Guid GetImageCacheTag(string originalImagePath, DateTime dateModified, IEnumerable<BaseImageEnhancer> imageEnhancers, BaseItem item, ImageType imageType)
+ public Guid GetImageCacheTag(string originalImagePath, DateTime dateModified, IEnumerable<IImageEnhancer> imageEnhancers, BaseItem item, ImageType imageType)
{
if (item == null)
{
@@ -574,7 +574,7 @@ namespace MediaBrowser.Controller.Drawing
/// <param name="imageType">Type of the image.</param>
/// <param name="imageIndex">Index of the image.</param>
/// <returns>Task{EnhancedImage}.</returns>
- private async Task<Image> ExecuteImageEnhancers(IEnumerable<BaseImageEnhancer> imageEnhancers, Image originalImage, BaseItem item, ImageType imageType, int imageIndex)
+ private async Task<Image> ExecuteImageEnhancers(IEnumerable<IImageEnhancer> imageEnhancers, Image originalImage, BaseItem item, ImageType imageType, int imageIndex)
{
var result = originalImage;
diff --git a/MediaBrowser.Controller/Entities/IVirtualFolderCreator.cs b/MediaBrowser.Controller/Entities/IVirtualFolderCreator.cs
new file mode 100644
index 000000000..57e9e8d5d
--- /dev/null
+++ b/MediaBrowser.Controller/Entities/IVirtualFolderCreator.cs
@@ -0,0 +1,15 @@
+
+namespace MediaBrowser.Controller.Entities
+{
+ /// <summary>
+ /// Interface IVirtualFolderCreator
+ /// </summary>
+ public interface IVirtualFolderCreator
+ {
+ /// <summary>
+ /// Gets the folder.
+ /// </summary>
+ /// <returns>Folder.</returns>
+ BasePluginFolder GetFolder();
+ }
+}
diff --git a/MediaBrowser.Controller/Entities/Movies/Movie.cs b/MediaBrowser.Controller/Entities/Movies/Movie.cs
index 6a76e2125..5b7661dcf 100644
--- a/MediaBrowser.Controller/Entities/Movies/Movie.cs
+++ b/MediaBrowser.Controller/Entities/Movies/Movie.cs
@@ -1,6 +1,7 @@
using MediaBrowser.Common.Extensions;
using MediaBrowser.Common.IO;
using MediaBrowser.Common.Win32;
+using MediaBrowser.Controller.IO;
using MediaBrowser.Model.Entities;
using System;
using System.Collections.Generic;
diff --git a/MediaBrowser.Controller/Entities/TV/Season.cs b/MediaBrowser.Controller/Entities/TV/Season.cs
index 140c90814..c80c59eaf 100644
--- a/MediaBrowser.Controller/Entities/TV/Season.cs
+++ b/MediaBrowser.Controller/Entities/TV/Season.cs
@@ -2,6 +2,7 @@
using MediaBrowser.Common.Extensions;
using MediaBrowser.Common.IO;
using MediaBrowser.Common.Win32;
+using MediaBrowser.Controller.IO;
using MediaBrowser.Controller.Library;
using MediaBrowser.Controller.Localization;
using MediaBrowser.Model.Entities;
diff --git a/MediaBrowser.Controller/Entities/User.cs b/MediaBrowser.Controller/Entities/User.cs
index f27e8c689..426e7f18e 100644
--- a/MediaBrowser.Controller/Entities/User.cs
+++ b/MediaBrowser.Controller/Entities/User.cs
@@ -1,6 +1,7 @@
using MediaBrowser.Common.Extensions;
using MediaBrowser.Common.IO;
using MediaBrowser.Common.Serialization;
+using MediaBrowser.Controller.IO;
using MediaBrowser.Model.Configuration;
using MediaBrowser.Model.Tasks;
using System;
diff --git a/MediaBrowser.Controller/IO/DirectoryWatchers.cs b/MediaBrowser.Controller/IO/DirectoryWatchers.cs
index 62e1a6a36..06ce95ec9 100644
--- a/MediaBrowser.Controller/IO/DirectoryWatchers.cs
+++ b/MediaBrowser.Controller/IO/DirectoryWatchers.cs
@@ -1,4 +1,5 @@
using MediaBrowser.Common.IO;
+using MediaBrowser.Common.ScheduledTasks;
using MediaBrowser.Controller.Entities;
using MediaBrowser.Controller.Library;
using MediaBrowser.Controller.ScheduledTasks;
@@ -67,15 +68,26 @@ namespace MediaBrowser.Controller.IO
private ILogger Logger { get; set; }
/// <summary>
+ /// Gets or sets the task manager.
+ /// </summary>
+ /// <value>The task manager.</value>
+ private ITaskManager TaskManager { get; set; }
+
+ /// <summary>
/// Initializes a new instance of the <see cref="DirectoryWatchers" /> class.
/// </summary>
- public DirectoryWatchers(ILogger logger)
+ public DirectoryWatchers(ILogger logger, ITaskManager taskManager)
{
if (logger == null)
{
throw new ArgumentNullException("logger");
}
+ if (taskManager == null)
+ {
+ throw new ArgumentNullException("taskManager");
+ }
+ TaskManager = taskManager;
Logger = logger;
}
@@ -421,7 +433,7 @@ namespace MediaBrowser.Controller.IO
// If the root folder changed, run the library task so the user can see it
if (itemsToRefresh.Any(i => i is AggregateFolder))
{
- Kernel.Instance.TaskManager.CancelIfRunningAndQueue<RefreshMediaLibraryTask>();
+ TaskManager.CancelIfRunningAndQueue<RefreshMediaLibraryTask>();
return;
}
diff --git a/MediaBrowser.Common/IO/FileSystem.cs b/MediaBrowser.Controller/IO/FileSystem.cs
index 3d65167bd..c7b7c660b 100644
--- a/MediaBrowser.Common/IO/FileSystem.cs
+++ b/MediaBrowser.Controller/IO/FileSystem.cs
@@ -6,7 +6,7 @@ using System.IO;
using System.Runtime.InteropServices;
using System.Text;
-namespace MediaBrowser.Common.IO
+namespace MediaBrowser.Controller.IO
{
/// <summary>
/// Class FileSystem
diff --git a/MediaBrowser.Controller/IO/FileSystemManager.cs b/MediaBrowser.Controller/IO/FileSystemManager.cs
index 9b54bb9d8..611b402d8 100644
--- a/MediaBrowser.Controller/IO/FileSystemManager.cs
+++ b/MediaBrowser.Controller/IO/FileSystemManager.cs
@@ -1,5 +1,6 @@
using MediaBrowser.Common.IO;
using MediaBrowser.Common.Kernel;
+using MediaBrowser.Common.ScheduledTasks;
using MediaBrowser.Controller.Entities;
using MediaBrowser.Model.Logging;
using System;
@@ -26,17 +27,18 @@ namespace MediaBrowser.Controller.IO
/// The _logger
/// </summary>
private readonly ILogger _logger;
-
+
/// <summary>
/// Initializes a new instance of the <see cref="FileSystemManager" /> class.
/// </summary>
/// <param name="kernel">The kernel.</param>
/// <param name="logger">The logger.</param>
- public FileSystemManager(Kernel kernel, ILogger logger)
+ /// <param name="taskManager">The task manager.</param>
+ public FileSystemManager(Kernel kernel, ILogger logger, ITaskManager taskManager)
: base(kernel)
{
_logger = logger;
- DirectoryWatchers = new DirectoryWatchers(logger);
+ DirectoryWatchers = new DirectoryWatchers(logger, taskManager);
}
/// <summary>
diff --git a/MediaBrowser.Controller/Kernel.cs b/MediaBrowser.Controller/Kernel.cs
index 952160b2b..21cfb5ddb 100644
--- a/MediaBrowser.Controller/Kernel.cs
+++ b/MediaBrowser.Controller/Kernel.cs
@@ -1,5 +1,4 @@
-using MediaBrowser.Common.IO;
-using MediaBrowser.Common.Kernel;
+using MediaBrowser.Common.Kernel;
using MediaBrowser.Common.Plugins;
using MediaBrowser.Controller.Drawing;
using MediaBrowser.Controller.Entities;
@@ -16,14 +15,10 @@ using MediaBrowser.Controller.ScheduledTasks;
using MediaBrowser.Controller.Updates;
using MediaBrowser.Controller.Weather;
using MediaBrowser.Model.Configuration;
-using MediaBrowser.Model.IO;
using MediaBrowser.Model.Logging;
-using MediaBrowser.Model.MediaInfo;
using MediaBrowser.Model.System;
using System;
using System.Collections.Generic;
-using System.ComponentModel.Composition;
-using System.ComponentModel.Composition.Hosting;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
@@ -179,31 +174,33 @@ namespace MediaBrowser.Controller
}
/// <summary>
+ /// Gets the list of Localized string files
+ /// </summary>
+ /// <value>The string files.</value>
+ public IEnumerable<LocalizedStringData> StringFiles { get; private set; }
+
+ /// <summary>
/// Gets the list of plugin configuration pages
/// </summary>
/// <value>The configuration pages.</value>
- [ImportMany(typeof(IPluginConfigurationPage))]
public IEnumerable<IPluginConfigurationPage> PluginConfigurationPages { get; private set; }
/// <summary>
/// Gets the intro providers.
/// </summary>
/// <value>The intro providers.</value>
- [ImportMany(typeof(IIntroProvider))]
public IEnumerable<IIntroProvider> IntroProviders { get; private set; }
/// <summary>
/// Gets the list of currently registered weather prvoiders
/// </summary>
/// <value>The weather providers.</value>
- [ImportMany(typeof(IWeatherProvider))]
public IEnumerable<IWeatherProvider> WeatherProviders { get; private set; }
/// <summary>
/// Gets the list of currently registered metadata prvoiders
/// </summary>
/// <value>The metadata providers enumerable.</value>
- [ImportMany(typeof(BaseMetadataProvider))]
public BaseMetadataProvider[] MetadataProviders { get; private set; }
/// <summary>
@@ -211,28 +208,24 @@ namespace MediaBrowser.Controller
/// Image processors are specialized metadata providers that run after the normal ones
/// </summary>
/// <value>The image enhancers.</value>
- [ImportMany(typeof(BaseImageEnhancer))]
- public BaseImageEnhancer[] ImageEnhancers { get; private set; }
+ public IEnumerable<IImageEnhancer> ImageEnhancers { get; private set; }
/// <summary>
/// Gets the list of currently registered entity resolvers
/// </summary>
/// <value>The entity resolvers enumerable.</value>
- [ImportMany(typeof(IBaseItemResolver))]
- internal IBaseItemResolver[] EntityResolvers { get; private set; }
+ internal IEnumerable<IBaseItemResolver> EntityResolvers { get; private set; }
/// <summary>
/// Gets the list of BasePluginFolders added by plugins
/// </summary>
/// <value>The plugin folders.</value>
- [ImportMany(typeof(BasePluginFolder))]
- internal IEnumerable<BasePluginFolder> PluginFolders { get; private set; }
+ internal IEnumerable<IVirtualFolderCreator> PluginFolderCreators { get; private set; }
/// <summary>
/// Gets the list of available user repositories
/// </summary>
/// <value>The user repositories.</value>
- [ImportMany(typeof(IUserRepository))]
private IEnumerable<IUserRepository> UserRepositories { get; set; }
/// <summary>
@@ -251,7 +244,6 @@ namespace MediaBrowser.Controller
/// Gets the list of available item repositories
/// </summary>
/// <value>The item repositories.</value>
- [ImportMany(typeof(IItemRepository))]
private IEnumerable<IItemRepository> ItemRepositories { get; set; }
/// <summary>
@@ -264,22 +256,19 @@ namespace MediaBrowser.Controller
/// Gets the list of available item repositories
/// </summary>
/// <value>The user data repositories.</value>
- [ImportMany(typeof(IUserDataRepository))]
private IEnumerable<IUserDataRepository> UserDataRepositories { get; set; }
/// <summary>
/// Gets the list of available DisplayPreferencesRepositories
/// </summary>
/// <value>The display preferences repositories.</value>
- [ImportMany(typeof(IDisplayPreferencesRepository))]
private IEnumerable<IDisplayPreferencesRepository> DisplayPreferencesRepositories { get; set; }
/// <summary>
/// Gets the list of entity resolution ignore rules
/// </summary>
/// <value>The entity resolution ignore rules.</value>
- [ImportMany(typeof(BaseResolutionIgnoreRule))]
- internal IEnumerable<BaseResolutionIgnoreRule> EntityResolutionIgnoreRules { get; private set; }
+ internal IEnumerable<IResolutionIgnoreRule> EntityResolutionIgnoreRules { get; private set; }
/// <summary>
/// Gets the active user data repository
@@ -303,47 +292,15 @@ namespace MediaBrowser.Controller
}
/// <summary>
- /// Gets or sets the zip client.
- /// </summary>
- /// <value>The zip client.</value>
- private IZipClient ZipClient { get; set; }
-
- /// <summary>
- /// Gets or sets the bluray examiner.
- /// </summary>
- /// <value>The bluray examiner.</value>
- private IBlurayExaminer BlurayExaminer { get; set; }
-
- /// <summary>
/// Creates a kernel based on a Data path, which is akin to our current programdata path
/// </summary>
/// <param name="appHost">The app host.</param>
- /// <param name="isoManager">The iso manager.</param>
- /// <param name="zipClient">The zip client.</param>
- /// <param name="blurayExaminer">The bluray examiner.</param>
/// <param name="logger">The logger.</param>
/// <exception cref="System.ArgumentNullException">isoManager</exception>
- public Kernel(IApplicationHost appHost, IIsoManager isoManager, IZipClient zipClient, IBlurayExaminer blurayExaminer, ILogger logger)
- : base(appHost, isoManager, logger)
+ public Kernel(IApplicationHost appHost, ILogger logger)
+ : base(appHost, logger)
{
- if (isoManager == null)
- {
- throw new ArgumentNullException("isoManager");
- }
-
- if (zipClient == null)
- {
- throw new ArgumentNullException("zipClient");
- }
-
- if (blurayExaminer == null)
- {
- throw new ArgumentNullException("blurayExaminer");
- }
-
Instance = this;
- ZipClient = zipClient;
- BlurayExaminer = blurayExaminer;
// For now there's no real way to inject this properly
BaseItem.Logger = logger;
@@ -356,13 +313,43 @@ namespace MediaBrowser.Controller
/// <summary>
/// Composes the exported values.
/// </summary>
- /// <param name="container">The container.</param>
- protected override void ComposeExportedValues(CompositionContainer container)
+ protected override void RegisterExportedValues()
{
- base.ComposeExportedValues(container);
+ ApplicationHost.Register(this);
+
+ base.RegisterExportedValues();
+ }
- container.ComposeExportedValue("kernel", this);
- container.ComposeExportedValue("blurayExaminer", BlurayExaminer);
+ /// <summary>
+ /// Composes the parts with ioc container.
+ /// </summary>
+ /// <param name="allTypes">All types.</param>
+ protected override void FindParts(Type[] allTypes)
+ {
+ InstallationManager = (InstallationManager)ApplicationHost.CreateInstance(typeof(InstallationManager));
+ FFMpegManager = (FFMpegManager)ApplicationHost.CreateInstance(typeof(FFMpegManager));
+ LibraryManager = (LibraryManager)ApplicationHost.CreateInstance(typeof(LibraryManager));
+ UserManager = (UserManager)ApplicationHost.CreateInstance(typeof(UserManager));
+ ImageManager = (ImageManager)ApplicationHost.CreateInstance(typeof(ImageManager));
+ ProviderManager = (ProviderManager)ApplicationHost.CreateInstance(typeof(ProviderManager));
+ UserDataManager = (UserDataManager)ApplicationHost.CreateInstance(typeof(UserDataManager));
+ PluginSecurityManager = (PluginSecurityManager)ApplicationHost.CreateInstance(typeof(PluginSecurityManager));
+
+ base.FindParts(allTypes);
+
+ EntityResolutionIgnoreRules = GetExports<IResolutionIgnoreRule>(allTypes);
+ UserDataRepositories = GetExports<IUserDataRepository>(allTypes);
+ UserRepositories = GetExports<IUserRepository>(allTypes);
+ DisplayPreferencesRepositories = GetExports<IDisplayPreferencesRepository>(allTypes);
+ ItemRepositories = GetExports<IItemRepository>(allTypes);
+ WeatherProviders = GetExports<IWeatherProvider>(allTypes);
+ IntroProviders = GetExports<IIntroProvider>(allTypes);
+ PluginConfigurationPages = GetExports<IPluginConfigurationPage>(allTypes);
+ ImageEnhancers = GetExports<IImageEnhancer>(allTypes).OrderBy(e => e.Priority).ToArray();
+ PluginFolderCreators = GetExports<IVirtualFolderCreator>(allTypes);
+ StringFiles = GetExports<LocalizedStringData>(allTypes);
+ EntityResolvers = GetExports<IBaseItemResolver>(allTypes).OrderBy(e => e.Priority).ToArray();
+ MetadataProviders = GetExports<BaseMetadataProvider>(allTypes).OrderBy(e => e.Priority).ToArray();
}
/// <summary>
@@ -371,24 +358,14 @@ namespace MediaBrowser.Controller
/// <returns>Task.</returns>
protected override async Task ReloadInternal()
{
- Logger.Info("Extracting tools");
-
// Reset these so that they can be lazy loaded again
Users = null;
RootFolder = null;
- ReloadResourcePools();
- InstallationManager = new InstallationManager(this, ZipClient, Logger);
- LibraryManager = new LibraryManager(this, Logger);
- UserManager = new UserManager(this, Logger);
- FFMpegManager = new FFMpegManager(this, ZipClient, Logger);
- ImageManager = new ImageManager(this, Logger);
- ProviderManager = new ProviderManager(this, Logger);
- UserDataManager = new UserDataManager(this, Logger);
- PluginSecurityManager = new PluginSecurityManager(this);
-
await base.ReloadInternal().ConfigureAwait(false);
+ ReloadResourcePools();
+
ReloadFileSystemManager();
await UserManager.RefreshUsersMetadata(CancellationToken.None).ConfigureAwait(false);
@@ -456,15 +433,6 @@ namespace MediaBrowser.Controller
DisplayPreferencesRepository = GetRepository(DisplayPreferencesRepositories, Configuration.DisplayPreferencesRepository);
var displayPreferencesRepoTask = DisplayPreferencesRepository.Initialize();
- // Sort the resolvers by priority
- EntityResolvers = EntityResolvers.OrderBy(e => e.Priority).ToArray();
-
- // Sort the providers by priority
- MetadataProviders = MetadataProviders.OrderBy(e => e.Priority).ToArray();
-
- // Sort the image processors by priority
- ImageEnhancers = ImageEnhancers.OrderBy(e => e.Priority).ToArray();
-
await Task.WhenAll(itemRepoTask, userRepoTask, userDataRepoTask, displayPreferencesRepoTask).ConfigureAwait(false);
}
@@ -503,7 +471,7 @@ namespace MediaBrowser.Controller
{
DisposeFileSystemManager();
- FileSystemManager = new FileSystemManager(this, Logger);
+ FileSystemManager = new FileSystemManager(this, Logger, TaskManager);
FileSystemManager.StartWatchers();
}
diff --git a/MediaBrowser.Controller/Library/ItemResolveArgs.cs b/MediaBrowser.Controller/Library/ItemResolveArgs.cs
index c95300f74..4d58af437 100644
--- a/MediaBrowser.Controller/Library/ItemResolveArgs.cs
+++ b/MediaBrowser.Controller/Library/ItemResolveArgs.cs
@@ -5,6 +5,7 @@ using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
+using MediaBrowser.Controller.IO;
namespace MediaBrowser.Controller.Library
{
diff --git a/MediaBrowser.Controller/Library/LibraryManager.cs b/MediaBrowser.Controller/Library/LibraryManager.cs
index 4087f9ef8..dfaef12cb 100644
--- a/MediaBrowser.Controller/Library/LibraryManager.cs
+++ b/MediaBrowser.Controller/Library/LibraryManager.cs
@@ -186,9 +186,9 @@ namespace MediaBrowser.Controller.Library
var rootFolder = Kernel.ItemRepository.RetrieveItem(rootFolderPath.GetMBId(typeof(AggregateFolder))) as AggregateFolder ?? (AggregateFolder)GetItem(rootFolderPath);
// Add in the plug-in folders
- foreach (var child in Kernel.PluginFolders)
+ foreach (var child in Kernel.PluginFolderCreators)
{
- rootFolder.AddVirtualChild(child);
+ rootFolder.AddVirtualChild(child.GetFolder());
}
return rootFolder;
diff --git a/MediaBrowser.Controller/Localization/BaseStrings.cs b/MediaBrowser.Controller/Localization/BaseStrings.cs
index c76df7c7c..22486d90d 100644
--- a/MediaBrowser.Controller/Localization/BaseStrings.cs
+++ b/MediaBrowser.Controller/Localization/BaseStrings.cs
@@ -1,9 +1,6 @@
-using MediaBrowser.Common.Localization;
-using System.ComponentModel.Composition;
-
+
namespace MediaBrowser.Controller.Localization
{
- [Export(typeof(LocalizedStringData))]
public class BaseStrings : LocalizedStringData
{
public BaseStrings()
diff --git a/MediaBrowser.Common/Localization/LocalizedStringData.cs b/MediaBrowser.Controller/Localization/LocalizedStringData.cs
index a507c7b6b..71200b8c8 100644
--- a/MediaBrowser.Common/Localization/LocalizedStringData.cs
+++ b/MediaBrowser.Controller/Localization/LocalizedStringData.cs
@@ -1,7 +1,7 @@
using System.IO;
using System.Xml.Serialization;
-namespace MediaBrowser.Common.Localization
+namespace MediaBrowser.Controller.Localization
{
/// <summary>
/// Class LocalizedStringData
diff --git a/MediaBrowser.Controller/Localization/LocalizedStrings.cs b/MediaBrowser.Controller/Localization/LocalizedStrings.cs
index 01b259591..6405be5f8 100644
--- a/MediaBrowser.Controller/Localization/LocalizedStrings.cs
+++ b/MediaBrowser.Controller/Localization/LocalizedStrings.cs
@@ -1,5 +1,4 @@
-using MediaBrowser.Common.Localization;
-using MediaBrowser.Model.Logging;
+using MediaBrowser.Model.Logging;
using System;
using System.Collections.Concurrent;
using System.Globalization;
diff --git a/MediaBrowser.Controller/MediaBrowser.Controller.csproj b/MediaBrowser.Controller/MediaBrowser.Controller.csproj
index 3978e6e39..213c30bac 100644
--- a/MediaBrowser.Controller/MediaBrowser.Controller.csproj
+++ b/MediaBrowser.Controller/MediaBrowser.Controller.csproj
@@ -64,7 +64,6 @@
<HintPath>..\packages\protobuf-net.2.0.0.621\lib\net40\protobuf-net.dll</HintPath>
</Reference>
<Reference Include="System" />
- <Reference Include="System.ComponentModel.Composition" />
<Reference Include="System.Core" />
<Reference Include="System.Data" />
<Reference Include="System.Drawing" />
@@ -91,6 +90,7 @@
<Compile Include="Entities\Genre.cs" />
<Compile Include="Entities\ICollectionFolder.cs" />
<Compile Include="Entities\IndexFolder.cs" />
+ <Compile Include="Entities\IVirtualFolderCreator.cs" />
<Compile Include="Entities\Movies\BoxSet.cs" />
<Compile Include="Entities\Movies\Movie.cs" />
<Compile Include="Entities\Person.cs" />
@@ -107,6 +107,7 @@
<Compile Include="Entities\CollectionFolder.cs" />
<Compile Include="Entities\Year.cs" />
<Compile Include="Extensions\XmlExtensions.cs" />
+ <Compile Include="IO\FileSystem.cs" />
<Compile Include="IO\FileSystemManager.cs" />
<Compile Include="IO\NetworkShares.cs" />
<Compile Include="Library\ChildrenChangedEventArgs.cs" />
@@ -117,6 +118,7 @@
<Compile Include="Localization\AURatingsDictionary.cs" />
<Compile Include="Localization\BaseStrings.cs" />
<Compile Include="Localization\GBRatingsDictionary.cs" />
+ <Compile Include="Localization\LocalizedStringData.cs" />
<Compile Include="Localization\LocalizedStrings.cs" />
<Compile Include="Localization\NLRatingsDictionary.cs" />
<Compile Include="Localization\Ratings.cs" />
@@ -134,7 +136,7 @@
<Compile Include="Plugins\IPluginConfigurationPage.cs" />
<Compile Include="Plugins\PluginSecurityManager.cs" />
<Compile Include="Providers\FanartBaseProvider.cs" />
- <Compile Include="Providers\BaseImageEnhancer.cs" />
+ <Compile Include="Providers\IImageEnhancer.cs" />
<Compile Include="Providers\ImagesByNameProvider.cs" />
<Compile Include="Providers\MediaInfo\BaseFFMpegImageProvider.cs" />
<Compile Include="Providers\MediaInfo\BaseFFMpegProvider.cs" />
@@ -165,7 +167,7 @@
<Compile Include="Providers\MediaInfo\FFMpegVideoImageProvider.cs" />
<Compile Include="Resolvers\Audio\MusicAlbumResolver.cs" />
<Compile Include="Resolvers\Audio\MusicArtistResolver.cs" />
- <Compile Include="Resolvers\BaseResolutionIgnoreRule.cs" />
+ <Compile Include="Resolvers\IResolutionIgnoreRule.cs" />
<Compile Include="Resolvers\CoreResolutionIgnoreRule.cs" />
<Compile Include="Resolvers\EntityResolutionHelper.cs" />
<Compile Include="Resolvers\LocalTrailerResolver.cs" />
@@ -223,8 +225,7 @@
<ItemGroup />
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<PropertyGroup>
- <PostBuildEvent>
- </PostBuildEvent>
+ <PostBuildEvent>xcopy "$(TargetPath)" "$(SolutionDir)\Nuget\dlls\" /y /d /r /i</PostBuildEvent>
</PropertyGroup>
<PropertyGroup>
<PreBuildEvent>
diff --git a/MediaBrowser.Controller/MediaInfo/FFMpegManager.cs b/MediaBrowser.Controller/MediaInfo/FFMpegManager.cs
index 9bc1ebaa5..7ef70ea42 100644
--- a/MediaBrowser.Controller/MediaInfo/FFMpegManager.cs
+++ b/MediaBrowser.Controller/MediaInfo/FFMpegManager.cs
@@ -4,9 +4,9 @@ using MediaBrowser.Common.Kernel;
using MediaBrowser.Common.Serialization;
using MediaBrowser.Controller.Entities;
using MediaBrowser.Controller.Entities.Audio;
-using MediaBrowser.Controller.Library;
using MediaBrowser.Model.Entities;
using MediaBrowser.Model.IO;
+using MediaBrowser.Model.Logging;
using System;
using System.Collections.Generic;
using System.ComponentModel;
@@ -17,7 +17,6 @@ using System.Reflection;
using System.Runtime.InteropServices;
using System.Threading;
using System.Threading.Tasks;
-using MediaBrowser.Model.Logging;
namespace MediaBrowser.Controller.MediaInfo
{
@@ -27,22 +26,6 @@ namespace MediaBrowser.Controller.MediaInfo
public class FFMpegManager : BaseManager<Kernel>
{
/// <summary>
- /// Holds the list of new items to generate chapter image for when the NewItemTimer expires
- /// </summary>
- private readonly List<Video> _newlyAddedItems = new List<Video>();
-
- /// <summary>
- /// The amount of time to wait before generating chapter images
- /// </summary>
- private const int NewItemDelay = 300000;
-
- /// <summary>
- /// The current new item timer
- /// </summary>
- /// <value>The new item timer.</value>
- private Timer NewItemTimer { get; set; }
-
- /// <summary>
/// Gets or sets the video image cache.
/// </summary>
/// <value>The video image cache.</value>
@@ -96,74 +79,10 @@ namespace MediaBrowser.Controller.MediaInfo
AudioImageCache = new FileSystemRepository(AudioImagesDataPath);
SubtitleCache = new FileSystemRepository(SubtitleCachePath);
- Kernel.LibraryManager.LibraryChanged += LibraryManager_LibraryChanged;
-
Task.Run(() => VersionedDirectoryPath = GetVersionedDirectoryPath());
}
/// <summary>
- /// Handles the LibraryChanged event of the LibraryManager control.
- /// </summary>
- /// <param name="sender">The source of the event.</param>
- /// <param name="e">The <see cref="ChildrenChangedEventArgs" /> instance containing the event data.</param>
- void LibraryManager_LibraryChanged(object sender, ChildrenChangedEventArgs e)
- {
- var videos = e.ItemsAdded.OfType<Video>().ToList();
-
- // Use a timer to prevent lots of these notifications from showing in a short period of time
- if (videos.Count > 0)
- {
- lock (_newlyAddedItems)
- {
- _newlyAddedItems.AddRange(videos);
-
- if (NewItemTimer == null)
- {
- NewItemTimer = new Timer(NewItemTimerCallback, null, NewItemDelay, Timeout.Infinite);
- }
- else
- {
- NewItemTimer.Change(NewItemDelay, Timeout.Infinite);
- }
- }
- }
- }
-
- /// <summary>
- /// Called when the new item timer expires
- /// </summary>
- /// <param name="state">The state.</param>
- private async void NewItemTimerCallback(object state)
- {
- List<Video> newItems;
-
- // Lock the list and release all resources
- lock (_newlyAddedItems)
- {
- newItems = _newlyAddedItems.ToList();
- _newlyAddedItems.Clear();
-
- NewItemTimer.Dispose();
- NewItemTimer = null;
- }
-
- // Limit the number of videos we generate images for
- // The idea is to catch new items that are added here and there
- // Mass image generation can be left to the scheduled task
- foreach (var video in newItems.Where(c => c.Chapters != null).Take(3))
- {
- try
- {
- await PopulateChapterImages(video, CancellationToken.None, true, true).ConfigureAwait(false);
- }
- catch (Exception ex)
- {
- _logger.ErrorException("Error creating chapter images for {0}", ex, video.Name);
- }
- }
- }
-
- /// <summary>
/// Releases unmanaged and - optionally - managed resources.
/// </summary>
/// <param name="dispose"><c>true</c> to release both managed and unmanaged resources; <c>false</c> to release only unmanaged resources.</param>
@@ -171,15 +90,8 @@ namespace MediaBrowser.Controller.MediaInfo
{
if (dispose)
{
- if (NewItemTimer != null)
- {
- NewItemTimer.Dispose();
- }
-
SetErrorMode(ErrorModes.SYSTEM_DEFAULT);
- Kernel.LibraryManager.LibraryChanged -= LibraryManager_LibraryChanged;
-
AudioImageCache.Dispose();
VideoImageCache.Dispose();
}
diff --git a/MediaBrowser.Controller/Providers/BaseImageEnhancer.cs b/MediaBrowser.Controller/Providers/BaseImageEnhancer.cs
deleted file mode 100644
index aeceeaf5f..000000000
--- a/MediaBrowser.Controller/Providers/BaseImageEnhancer.cs
+++ /dev/null
@@ -1,99 +0,0 @@
-using MediaBrowser.Controller.Entities;
-using MediaBrowser.Model.Drawing;
-using MediaBrowser.Model.Entities;
-using System;
-using System.Drawing;
-using System.Threading.Tasks;
-
-namespace MediaBrowser.Controller.Providers
-{
- /// <summary>
- /// Class BaseImageEnhancer
- /// </summary>
- public abstract class BaseImageEnhancer : IDisposable
- {
- /// <summary>
- /// Return true only if the given image for the given item will be enhanced by this enhancer.
- /// </summary>
- /// <param name="item">The item.</param>
- /// <param name="imageType">Type of the image.</param>
- /// <returns><c>true</c> if this enhancer will enhance the supplied image for the supplied item, <c>false</c> otherwise</returns>
- public abstract bool Supports(BaseItem item, ImageType imageType);
-
- /// <summary>
- /// Gets the priority or order in which this enhancer should be run.
- /// </summary>
- /// <value>The priority.</value>
- public abstract MetadataProviderPriority Priority { get; }
-
- /// <summary>
- /// Return the date of the last configuration change affecting the provided baseitem and image type
- /// </summary>
- /// <param name="item">The item.</param>
- /// <param name="imageType">Type of the image.</param>
- /// <returns>Date of last config change</returns>
- public virtual DateTime LastConfigurationChange(BaseItem item, ImageType imageType)
- {
- return DateTime.MinValue;
- }
-
- /// <summary>
- /// Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources.
- /// </summary>
- public void Dispose()
- {
- Dispose(true);
- GC.SuppressFinalize(this);
- }
-
- /// <summary>
- /// Releases unmanaged and - optionally - managed resources.
- /// </summary>
- /// <param name="dispose"><c>true</c> to release both managed and unmanaged resources; <c>false</c> to release only unmanaged resources.</param>
- protected virtual void Dispose(bool dispose)
- {
- }
-
- /// <summary>
- /// Gets the size of the enhanced image.
- /// </summary>
- /// <param name="item">The item.</param>
- /// <param name="imageType">Type of the image.</param>
- /// <param name="imageIndex">Index of the image.</param>
- /// <param name="originalImageSize">Size of the original image.</param>
- /// <returns>ImageSize.</returns>
- public virtual ImageSize GetEnhancedImageSize(BaseItem item, ImageType imageType, int imageIndex, ImageSize originalImageSize)
- {
- return originalImageSize;
- }
-
- /// <summary>
- /// Enhances the supplied image and returns it
- /// </summary>
- /// <param name="item">The item.</param>
- /// <param name="originalImage">The original image.</param>
- /// <param name="imageType">Type of the image.</param>
- /// <param name="imageIndex">Index of the image.</param>
- /// <returns>Task{System.Drawing.Image}.</returns>
- protected abstract Task<Image> EnhanceImageAsyncInternal(BaseItem item, Image originalImage, ImageType imageType, int imageIndex);
-
- /// <summary>
- /// Enhances the image async.
- /// </summary>
- /// <param name="item">The item.</param>
- /// <param name="originalImage">The original image.</param>
- /// <param name="imageType">Type of the image.</param>
- /// <param name="imageIndex">Index of the image.</param>
- /// <returns>Task{Image}.</returns>
- /// <exception cref="System.ArgumentNullException"></exception>
- public Task<Image> EnhanceImageAsync(BaseItem item, Image originalImage, ImageType imageType, int imageIndex)
- {
- if (item == null || originalImage == null)
- {
- throw new ArgumentNullException();
- }
-
- return EnhanceImageAsyncInternal(item, originalImage, imageType, imageIndex);
- }
- }
-}
diff --git a/MediaBrowser.Controller/Providers/FolderProviderFromXml.cs b/MediaBrowser.Controller/Providers/FolderProviderFromXml.cs
index ab0f37b96..16b120ebd 100644
--- a/MediaBrowser.Controller/Providers/FolderProviderFromXml.cs
+++ b/MediaBrowser.Controller/Providers/FolderProviderFromXml.cs
@@ -1,7 +1,6 @@
using MediaBrowser.Controller.Entities;
using MediaBrowser.Model.Entities;
using System;
-using System.ComponentModel.Composition;
using System.IO;
using System.Threading;
using System.Threading.Tasks;
@@ -11,7 +10,6 @@ namespace MediaBrowser.Controller.Providers
/// <summary>
/// Provides metadata for Folders and all subclasses by parsing folder.xml
/// </summary>
- [Export(typeof(BaseMetadataProvider))]
public class FolderProviderFromXml : BaseMetadataProvider
{
/// <summary>
diff --git a/MediaBrowser.Controller/Providers/IImageEnhancer.cs b/MediaBrowser.Controller/Providers/IImageEnhancer.cs
new file mode 100644
index 000000000..24296b664
--- /dev/null
+++ b/MediaBrowser.Controller/Providers/IImageEnhancer.cs
@@ -0,0 +1,55 @@
+using MediaBrowser.Controller.Entities;
+using MediaBrowser.Model.Drawing;
+using MediaBrowser.Model.Entities;
+using System;
+using System.Drawing;
+using System.Threading.Tasks;
+
+namespace MediaBrowser.Controller.Providers
+{
+ public interface IImageEnhancer
+ {
+ /// <summary>
+ /// Return true only if the given image for the given item will be enhanced by this enhancer.
+ /// </summary>
+ /// <param name="item">The item.</param>
+ /// <param name="imageType">Type of the image.</param>
+ /// <returns><c>true</c> if this enhancer will enhance the supplied image for the supplied item, <c>false</c> otherwise</returns>
+ bool Supports(BaseItem item, ImageType imageType);
+
+ /// <summary>
+ /// Gets the priority or order in which this enhancer should be run.
+ /// </summary>
+ /// <value>The priority.</value>
+ MetadataProviderPriority Priority { get; }
+
+ /// <summary>
+ /// Return the date of the last configuration change affecting the provided baseitem and image type
+ /// </summary>
+ /// <param name="item">The item.</param>
+ /// <param name="imageType">Type of the image.</param>
+ /// <returns>Date of last config change</returns>
+ DateTime LastConfigurationChange(BaseItem item, ImageType imageType);
+
+ /// <summary>
+ /// Gets the size of the enhanced image.
+ /// </summary>
+ /// <param name="item">The item.</param>
+ /// <param name="imageType">Type of the image.</param>
+ /// <param name="imageIndex">Index of the image.</param>
+ /// <param name="originalImageSize">Size of the original image.</param>
+ /// <returns>ImageSize.</returns>
+ ImageSize GetEnhancedImageSize(BaseItem item, ImageType imageType, int imageIndex, ImageSize originalImageSize);
+
+ /// <summary>
+ /// Enhances the image async.
+ /// </summary>
+ /// <param name="item">The item.</param>
+ /// <param name="originalImage">The original image.</param>
+ /// <param name="imageType">Type of the image.</param>
+ /// <param name="imageIndex">Index of the image.</param>
+ /// <returns>Task{Image}.</returns>
+ /// <exception cref="System.ArgumentNullException"></exception>
+ Task<Image> EnhanceImageAsync(BaseItem item, Image originalImage, ImageType imageType, int imageIndex);
+ }
+} \ No newline at end of file
diff --git a/MediaBrowser.Controller/Providers/ImageFromMediaLocationProvider.cs b/MediaBrowser.Controller/Providers/ImageFromMediaLocationProvider.cs
index 985876406..4c3250ff4 100644
--- a/MediaBrowser.Controller/Providers/ImageFromMediaLocationProvider.cs
+++ b/MediaBrowser.Controller/Providers/ImageFromMediaLocationProvider.cs
@@ -3,7 +3,6 @@ using MediaBrowser.Controller.Entities;
using MediaBrowser.Model.Entities;
using System;
using System.Collections.Generic;
-using System.ComponentModel.Composition;
using System.IO;
using System.Linq;
using System.Threading;
@@ -14,7 +13,6 @@ namespace MediaBrowser.Controller.Providers
/// <summary>
/// Provides images for all types by looking for standard images - folder, backdrop, logo, etc.
/// </summary>
- [Export(typeof(BaseMetadataProvider))]
public class ImageFromMediaLocationProvider : BaseMetadataProvider
{
/// <summary>
diff --git a/MediaBrowser.Controller/Providers/ImagesByNameProvider.cs b/MediaBrowser.Controller/Providers/ImagesByNameProvider.cs
index 114176e2c..fcc31a75e 100644
--- a/MediaBrowser.Controller/Providers/ImagesByNameProvider.cs
+++ b/MediaBrowser.Controller/Providers/ImagesByNameProvider.cs
@@ -1,9 +1,8 @@
-using System.Globalization;
-using MediaBrowser.Common.IO;
-using MediaBrowser.Common.Win32;
+using MediaBrowser.Common.Win32;
using MediaBrowser.Controller.Entities;
+using MediaBrowser.Controller.IO;
using System;
-using System.ComponentModel.Composition;
+using System.Globalization;
using System.IO;
using System.Linq;
@@ -12,7 +11,6 @@ namespace MediaBrowser.Controller.Providers
/// <summary>
/// Provides images for generic types by looking for standard images in the IBN
/// </summary>
- [Export(typeof(BaseMetadataProvider))]
public class ImagesByNameProvider : ImageFromMediaLocationProvider
{
/// <summary>
diff --git a/MediaBrowser.Controller/Providers/MediaInfo/FFMpegAudioImageProvider.cs b/MediaBrowser.Controller/Providers/MediaInfo/FFMpegAudioImageProvider.cs
index 523192d4e..907c692b8 100644
--- a/MediaBrowser.Controller/Providers/MediaInfo/FFMpegAudioImageProvider.cs
+++ b/MediaBrowser.Controller/Providers/MediaInfo/FFMpegAudioImageProvider.cs
@@ -2,7 +2,6 @@
using MediaBrowser.Controller.Entities.Audio;
using MediaBrowser.Model.Entities;
using System;
-using System.ComponentModel.Composition;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
@@ -12,7 +11,6 @@ namespace MediaBrowser.Controller.Providers.MediaInfo
/// <summary>
/// Uses ffmpeg to create video images
/// </summary>
- [Export(typeof(BaseMetadataProvider))]
public class FFMpegAudioImageProvider : BaseFFMpegImageProvider<Audio>
{
diff --git a/MediaBrowser.Controller/Providers/MediaInfo/FFMpegVideoImageProvider.cs b/MediaBrowser.Controller/Providers/MediaInfo/FFMpegVideoImageProvider.cs
index 2f617b5b1..636454cd0 100644
--- a/MediaBrowser.Controller/Providers/MediaInfo/FFMpegVideoImageProvider.cs
+++ b/MediaBrowser.Controller/Providers/MediaInfo/FFMpegVideoImageProvider.cs
@@ -2,7 +2,6 @@
using MediaBrowser.Controller.Entities;
using MediaBrowser.Model.Entities;
using System;
-using System.ComponentModel.Composition;
using System.Threading;
using System.Threading.Tasks;
@@ -11,10 +10,23 @@ namespace MediaBrowser.Controller.Providers.MediaInfo
/// <summary>
/// Uses ffmpeg to create video images
/// </summary>
- [Export(typeof(BaseMetadataProvider))]
public class FFMpegVideoImageProvider : BaseFFMpegImageProvider<Video>
{
/// <summary>
+ /// The _iso manager
+ /// </summary>
+ private readonly IIsoManager _isoManager;
+
+ /// <summary>
+ /// Initializes a new instance of the <see cref="FFMpegVideoImageProvider" /> class.
+ /// </summary>
+ /// <param name="isoManager">The iso manager.</param>
+ public FFMpegVideoImageProvider(IIsoManager isoManager)
+ {
+ _isoManager = isoManager;
+ }
+
+ /// <summary>
/// Supportses the specified item.
/// </summary>
/// <param name="item">The item.</param>
@@ -30,7 +42,7 @@ namespace MediaBrowser.Controller.Providers.MediaInfo
if (video != null)
{
- if (video.VideoType == VideoType.Iso && video.IsoType.HasValue && Kernel.Instance.IsoManager.CanMount(item.Path))
+ if (video.VideoType == VideoType.Iso && video.IsoType.HasValue && _isoManager.CanMount(item.Path))
{
return true;
}
@@ -82,7 +94,7 @@ namespace MediaBrowser.Controller.Providers.MediaInfo
{
if (item.VideoType == VideoType.Iso)
{
- return Kernel.Instance.IsoManager.Mount(item.Path, cancellationToken);
+ return _isoManager.Mount(item.Path, cancellationToken);
}
return NullMountTaskResult;
diff --git a/MediaBrowser.Controller/Providers/MediaInfo/FFProbeAudioInfoProvider.cs b/MediaBrowser.Controller/Providers/MediaInfo/FFProbeAudioInfoProvider.cs
index 49c829fff..01711d771 100644
--- a/MediaBrowser.Controller/Providers/MediaInfo/FFProbeAudioInfoProvider.cs
+++ b/MediaBrowser.Controller/Providers/MediaInfo/FFProbeAudioInfoProvider.cs
@@ -5,7 +5,6 @@ using MediaBrowser.Controller.MediaInfo;
using MediaBrowser.Model.Entities;
using System;
using System.Collections.Generic;
-using System.ComponentModel.Composition;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
@@ -15,7 +14,6 @@ namespace MediaBrowser.Controller.Providers.MediaInfo
/// <summary>
/// Extracts audio information using ffprobe
/// </summary>
- [Export(typeof(BaseMetadataProvider))]
public class FFProbeAudioInfoProvider : BaseFFProbeProvider<Audio>
{
/// <summary>
diff --git a/MediaBrowser.Controller/Providers/MediaInfo/FFProbeVideoInfoProvider.cs b/MediaBrowser.Controller/Providers/MediaInfo/FFProbeVideoInfoProvider.cs
index 2df495b23..443d28b67 100644
--- a/MediaBrowser.Controller/Providers/MediaInfo/FFProbeVideoInfoProvider.cs
+++ b/MediaBrowser.Controller/Providers/MediaInfo/FFProbeVideoInfoProvider.cs
@@ -6,7 +6,6 @@ using MediaBrowser.Model.Entities;
using MediaBrowser.Model.MediaInfo;
using System;
using System.Collections.Generic;
-using System.ComponentModel.Composition;
using System.IO;
using System.Linq;
using System.Threading;
@@ -17,7 +16,6 @@ namespace MediaBrowser.Controller.Providers.MediaInfo
/// <summary>
/// Extracts video information using ffprobe
/// </summary>
- [Export(typeof(BaseMetadataProvider))]
public class FFProbeVideoInfoProvider : BaseFFProbeProvider<Video>
{
/// <summary>
@@ -32,13 +30,18 @@ namespace MediaBrowser.Controller.Providers.MediaInfo
/// <value>The bluray examiner.</value>
private IBlurayExaminer BlurayExaminer { get; set; }
+ /// <summary>
+ /// The _iso manager
+ /// </summary>
+ private readonly IIsoManager _isoManager;
+
/// <summary>
/// Initializes a new instance of the <see cref="FFProbeVideoInfoProvider" /> class.
/// </summary>
+ /// <param name="isoManager">The iso manager.</param>
/// <param name="blurayExaminer">The bluray examiner.</param>
/// <exception cref="System.ArgumentNullException">blurayExaminer</exception>
- [ImportingConstructor]
- public FFProbeVideoInfoProvider([Import("blurayExaminer")] IBlurayExaminer blurayExaminer)
+ public FFProbeVideoInfoProvider(IIsoManager isoManager, IBlurayExaminer blurayExaminer)
: base()
{
if (blurayExaminer == null)
@@ -47,6 +50,7 @@ namespace MediaBrowser.Controller.Providers.MediaInfo
}
BlurayExaminer = blurayExaminer;
+ _isoManager = isoManager;
BdInfoCache = new FileSystemRepository(Path.Combine(Kernel.Instance.ApplicationPaths.CachePath, "bdinfo"));
}
@@ -76,7 +80,7 @@ namespace MediaBrowser.Controller.Providers.MediaInfo
{
if (video.VideoType == VideoType.Iso)
{
- return Kernel.Instance.IsoManager.CanMount(item.Path);
+ return _isoManager.CanMount(item.Path);
}
return video.VideoType == VideoType.VideoFile || video.VideoType == VideoType.Dvd || video.VideoType == VideoType.BluRay;
@@ -101,7 +105,7 @@ namespace MediaBrowser.Controller.Providers.MediaInfo
{
PopulateDvdStreamFiles(item, mount);
}
-
+
base.OnPreFetch(item, mount);
}
@@ -115,7 +119,7 @@ namespace MediaBrowser.Controller.Providers.MediaInfo
{
if (item.VideoType == VideoType.Iso)
{
- return Kernel.Instance.IsoManager.Mount(item.Path, cancellationToken);
+ return _isoManager.Mount(item.Path, cancellationToken);
}
return base.MountIsoIfNeeded(item, cancellationToken);
diff --git a/MediaBrowser.Controller/Providers/Movies/FanArtMovieProvider.cs b/MediaBrowser.Controller/Providers/Movies/FanArtMovieProvider.cs
index 38e547523..e833e4931 100644
--- a/MediaBrowser.Controller/Providers/Movies/FanArtMovieProvider.cs
+++ b/MediaBrowser.Controller/Providers/Movies/FanArtMovieProvider.cs
@@ -4,7 +4,6 @@ using MediaBrowser.Controller.Entities.Movies;
using MediaBrowser.Model.Entities;
using MediaBrowser.Model.Net;
using System;
-using System.ComponentModel.Composition;
using System.IO;
using System.Threading;
using System.Threading.Tasks;
@@ -15,7 +14,6 @@ namespace MediaBrowser.Controller.Providers.Movies
/// <summary>
/// Class FanArtMovieProvider
/// </summary>
- [Export(typeof(BaseMetadataProvider))]
class FanArtMovieProvider : FanartBaseProvider
{
/// <summary>
diff --git a/MediaBrowser.Controller/Providers/Movies/MovieDbProvider.cs b/MediaBrowser.Controller/Providers/Movies/MovieDbProvider.cs
index 2319e5cfa..72f8a3fc7 100644
--- a/MediaBrowser.Controller/Providers/Movies/MovieDbProvider.cs
+++ b/MediaBrowser.Controller/Providers/Movies/MovieDbProvider.cs
@@ -7,7 +7,6 @@ using MediaBrowser.Model.Logging;
using MediaBrowser.Model.Net;
using System;
using System.Collections.Generic;
-using System.ComponentModel.Composition;
using System.Globalization;
using System.IO;
using System.Linq;
@@ -29,7 +28,6 @@ namespace MediaBrowser.Controller.Providers.Movies
/// <summary>
/// Class MovieDbProvider
/// </summary>
- [Export(typeof(BaseMetadataProvider))]
public class MovieDbProvider : BaseMetadataProvider
{
/// <summary>
diff --git a/MediaBrowser.Controller/Providers/Movies/MovieProviderFromJson.cs b/MediaBrowser.Controller/Providers/Movies/MovieProviderFromJson.cs
index ad5f6626b..45079ddda 100644
--- a/MediaBrowser.Controller/Providers/Movies/MovieProviderFromJson.cs
+++ b/MediaBrowser.Controller/Providers/Movies/MovieProviderFromJson.cs
@@ -1,7 +1,6 @@
using MediaBrowser.Common.Serialization;
using MediaBrowser.Controller.Entities;
using System;
-using System.ComponentModel.Composition;
using System.IO;
using System.Threading;
using System.Threading.Tasks;
@@ -11,7 +10,6 @@ namespace MediaBrowser.Controller.Providers.Movies
/// <summary>
/// Class MovieProviderFromJson
/// </summary>
- [Export(typeof(BaseMetadataProvider))]
public class MovieProviderFromJson : MovieDbProvider
{
/// <summary>
diff --git a/MediaBrowser.Controller/Providers/Movies/MovieProviderFromXml.cs b/MediaBrowser.Controller/Providers/Movies/MovieProviderFromXml.cs
index b180fa580..274930bc8 100644
--- a/MediaBrowser.Controller/Providers/Movies/MovieProviderFromXml.cs
+++ b/MediaBrowser.Controller/Providers/Movies/MovieProviderFromXml.cs
@@ -1,7 +1,6 @@
using MediaBrowser.Controller.Entities;
using MediaBrowser.Controller.Entities.Movies;
using System;
-using System.ComponentModel.Composition;
using System.IO;
using System.Threading;
using System.Threading.Tasks;
@@ -11,7 +10,6 @@ namespace MediaBrowser.Controller.Providers.Movies
/// <summary>
/// Class MovieProviderFromXml
/// </summary>
- [Export(typeof(BaseMetadataProvider))]
public class MovieProviderFromXml : BaseMetadataProvider
{
/// <summary>
diff --git a/MediaBrowser.Controller/Providers/Movies/PersonProviderFromJson.cs b/MediaBrowser.Controller/Providers/Movies/PersonProviderFromJson.cs
index 19a707be3..b4b4933e2 100644
--- a/MediaBrowser.Controller/Providers/Movies/PersonProviderFromJson.cs
+++ b/MediaBrowser.Controller/Providers/Movies/PersonProviderFromJson.cs
@@ -1,7 +1,6 @@
using MediaBrowser.Common.Serialization;
using MediaBrowser.Controller.Entities;
using System;
-using System.ComponentModel.Composition;
using System.IO;
using System.Threading;
using System.Threading.Tasks;
@@ -11,7 +10,6 @@ namespace MediaBrowser.Controller.Providers.Movies
/// <summary>
/// Class PersonProviderFromJson
/// </summary>
- [Export(typeof(BaseMetadataProvider))]
class PersonProviderFromJson : TmdbPersonProvider
{
/// <summary>
diff --git a/MediaBrowser.Controller/Providers/Movies/TmdbPersonProvider.cs b/MediaBrowser.Controller/Providers/Movies/TmdbPersonProvider.cs
index 4cdfc5894..7b5d62fb0 100644
--- a/MediaBrowser.Controller/Providers/Movies/TmdbPersonProvider.cs
+++ b/MediaBrowser.Controller/Providers/Movies/TmdbPersonProvider.cs
@@ -4,7 +4,6 @@ using MediaBrowser.Model.Entities;
using MediaBrowser.Model.Net;
using System;
using System.Collections.Generic;
-using System.ComponentModel.Composition;
using System.Globalization;
using System.IO;
using System.Linq;
@@ -17,7 +16,6 @@ namespace MediaBrowser.Controller.Providers.Movies
/// <summary>
/// Class TmdbPersonProvider
/// </summary>
- [Export(typeof(BaseMetadataProvider))]
public class TmdbPersonProvider : BaseMetadataProvider
{
/// <summary>
diff --git a/MediaBrowser.Controller/Providers/SortNameProvider.cs b/MediaBrowser.Controller/Providers/SortNameProvider.cs
index 071732f3e..933b0c78c 100644
--- a/MediaBrowser.Controller/Providers/SortNameProvider.cs
+++ b/MediaBrowser.Controller/Providers/SortNameProvider.cs
@@ -1,7 +1,6 @@
using MediaBrowser.Controller.Entities;
using MediaBrowser.Controller.Entities.Audio;
using MediaBrowser.Controller.Entities.TV;
-using System.ComponentModel.Composition;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
@@ -11,7 +10,6 @@ namespace MediaBrowser.Controller.Providers
/// <summary>
/// Class SortNameProvider
/// </summary>
- [Export(typeof(BaseMetadataProvider))]
public class SortNameProvider : BaseMetadataProvider
{
/// <summary>
diff --git a/MediaBrowser.Controller/Providers/TV/EpisodeImageFromMediaLocationProvider.cs b/MediaBrowser.Controller/Providers/TV/EpisodeImageFromMediaLocationProvider.cs
index a493ce746..c6210f74c 100644
--- a/MediaBrowser.Controller/Providers/TV/EpisodeImageFromMediaLocationProvider.cs
+++ b/MediaBrowser.Controller/Providers/TV/EpisodeImageFromMediaLocationProvider.cs
@@ -2,7 +2,6 @@
using MediaBrowser.Controller.Entities.TV;
using MediaBrowser.Model.Entities;
using System;
-using System.ComponentModel.Composition;
using System.IO;
using System.Threading;
using System.Threading.Tasks;
@@ -12,7 +11,6 @@ namespace MediaBrowser.Controller.Providers.TV
/// <summary>
/// Class EpisodeImageFromMediaLocationProvider
/// </summary>
- [Export(typeof(BaseMetadataProvider))]
public class EpisodeImageFromMediaLocationProvider : BaseMetadataProvider
{
/// <summary>
diff --git a/MediaBrowser.Controller/Providers/TV/EpisodeProviderFromXml.cs b/MediaBrowser.Controller/Providers/TV/EpisodeProviderFromXml.cs
index 08d0988eb..7a96e368c 100644
--- a/MediaBrowser.Controller/Providers/TV/EpisodeProviderFromXml.cs
+++ b/MediaBrowser.Controller/Providers/TV/EpisodeProviderFromXml.cs
@@ -2,7 +2,6 @@
using MediaBrowser.Controller.Entities.TV;
using MediaBrowser.Model.Entities;
using System;
-using System.ComponentModel.Composition;
using System.IO;
using System.Threading;
using System.Threading.Tasks;
@@ -12,7 +11,6 @@ namespace MediaBrowser.Controller.Providers.TV
/// <summary>
/// Class EpisodeProviderFromXml
/// </summary>
- [Export(typeof(BaseMetadataProvider))]
public class EpisodeProviderFromXml : BaseMetadataProvider
{
/// <summary>
diff --git a/MediaBrowser.Controller/Providers/TV/FanArtTVProvider.cs b/MediaBrowser.Controller/Providers/TV/FanArtTVProvider.cs
index 2640e0482..05ab172a8 100644
--- a/MediaBrowser.Controller/Providers/TV/FanArtTVProvider.cs
+++ b/MediaBrowser.Controller/Providers/TV/FanArtTVProvider.cs
@@ -4,7 +4,6 @@ using MediaBrowser.Controller.Entities.TV;
using MediaBrowser.Model.Entities;
using MediaBrowser.Model.Net;
using System;
-using System.ComponentModel.Composition;
using System.IO;
using System.Threading;
using System.Threading.Tasks;
@@ -12,7 +11,6 @@ using System.Xml;
namespace MediaBrowser.Controller.Providers.TV
{
- [Export(typeof(BaseMetadataProvider))]
class FanArtTVProvider : FanartBaseProvider
{
protected string FanArtBaseUrl = "http://api.fanart.tv/webservice/series/{0}/{1}/xml/all/1/1";
diff --git a/MediaBrowser.Controller/Providers/TV/RemoteEpisodeProvider.cs b/MediaBrowser.Controller/Providers/TV/RemoteEpisodeProvider.cs
index d1d931a62..b06598114 100644
--- a/MediaBrowser.Controller/Providers/TV/RemoteEpisodeProvider.cs
+++ b/MediaBrowser.Controller/Providers/TV/RemoteEpisodeProvider.cs
@@ -5,7 +5,6 @@ using MediaBrowser.Controller.Resolvers.TV;
using MediaBrowser.Model.Entities;
using MediaBrowser.Model.Net;
using System;
-using System.ComponentModel.Composition;
using System.IO;
using System.Linq;
using System.Threading;
@@ -18,7 +17,6 @@ namespace MediaBrowser.Controller.Providers.TV
/// <summary>
/// Class RemoteEpisodeProvider
/// </summary>
- [Export(typeof(BaseMetadataProvider))]
class RemoteEpisodeProvider : BaseMetadataProvider
{
diff --git a/MediaBrowser.Controller/Providers/TV/RemoteSeasonProvider.cs b/MediaBrowser.Controller/Providers/TV/RemoteSeasonProvider.cs
index 277b6d891..3e7f6b1a2 100644
--- a/MediaBrowser.Controller/Providers/TV/RemoteSeasonProvider.cs
+++ b/MediaBrowser.Controller/Providers/TV/RemoteSeasonProvider.cs
@@ -5,7 +5,6 @@ using MediaBrowser.Model.Entities;
using MediaBrowser.Model.Net;
using System;
using System.Collections.Generic;
-using System.ComponentModel.Composition;
using System.IO;
using System.Threading;
using System.Threading.Tasks;
@@ -16,7 +15,6 @@ namespace MediaBrowser.Controller.Providers.TV
/// <summary>
/// Class RemoteSeasonProvider
/// </summary>
- [Export(typeof(BaseMetadataProvider))]
class RemoteSeasonProvider : BaseMetadataProvider
{
diff --git a/MediaBrowser.Controller/Providers/TV/RemoteSeriesProvider.cs b/MediaBrowser.Controller/Providers/TV/RemoteSeriesProvider.cs
index 985aa0262..b8941dbba 100644
--- a/MediaBrowser.Controller/Providers/TV/RemoteSeriesProvider.cs
+++ b/MediaBrowser.Controller/Providers/TV/RemoteSeriesProvider.cs
@@ -7,7 +7,6 @@ using MediaBrowser.Model.Entities;
using MediaBrowser.Model.Net;
using System;
using System.Collections.Generic;
-using System.ComponentModel.Composition;
using System.IO;
using System.Net;
using System.Text;
@@ -20,7 +19,6 @@ namespace MediaBrowser.Controller.Providers.TV
/// <summary>
/// Class RemoteSeriesProvider
/// </summary>
- [Export(typeof(BaseMetadataProvider))]
class RemoteSeriesProvider : BaseMetadataProvider
{
diff --git a/MediaBrowser.Controller/Providers/TV/SeriesProviderFromXml.cs b/MediaBrowser.Controller/Providers/TV/SeriesProviderFromXml.cs
index c92841fb6..aa2cde28d 100644
--- a/MediaBrowser.Controller/Providers/TV/SeriesProviderFromXml.cs
+++ b/MediaBrowser.Controller/Providers/TV/SeriesProviderFromXml.cs
@@ -2,7 +2,6 @@
using MediaBrowser.Controller.Entities.TV;
using MediaBrowser.Model.Entities;
using System;
-using System.ComponentModel.Composition;
using System.IO;
using System.Threading;
using System.Threading.Tasks;
@@ -12,7 +11,6 @@ namespace MediaBrowser.Controller.Providers.TV
/// <summary>
/// Class SeriesProviderFromXml
/// </summary>
- [Export(typeof(BaseMetadataProvider))]
public class SeriesProviderFromXml : BaseMetadataProvider
{
/// <summary>
diff --git a/MediaBrowser.Controller/Resolvers/Audio/AudioResolver.cs b/MediaBrowser.Controller/Resolvers/Audio/AudioResolver.cs
index f827bf047..6e1bbfbfe 100644
--- a/MediaBrowser.Controller/Resolvers/Audio/AudioResolver.cs
+++ b/MediaBrowser.Controller/Resolvers/Audio/AudioResolver.cs
@@ -1,16 +1,26 @@
using MediaBrowser.Controller.Library;
-using System.ComponentModel.Composition;
namespace MediaBrowser.Controller.Resolvers.Audio
{
- [Export(typeof(IBaseItemResolver))]
+ /// <summary>
+ /// Class AudioResolver
+ /// </summary>
public class AudioResolver : BaseItemResolver<Entities.Audio.Audio>
{
+ /// <summary>
+ /// Gets the priority.
+ /// </summary>
+ /// <value>The priority.</value>
public override ResolverPriority Priority
{
get { return ResolverPriority.Last; }
}
-
+
+ /// <summary>
+ /// Resolves the specified args.
+ /// </summary>
+ /// <param name="args">The args.</param>
+ /// <returns>Entities.Audio.Audio.</returns>
protected override Entities.Audio.Audio Resolve(ItemResolveArgs args)
{
// Return audio if the path is a file and has a matching extension
diff --git a/MediaBrowser.Controller/Resolvers/Audio/MusicAlbumResolver.cs b/MediaBrowser.Controller/Resolvers/Audio/MusicAlbumResolver.cs
index 8b2e49f31..d8d2c326d 100644
--- a/MediaBrowser.Controller/Resolvers/Audio/MusicAlbumResolver.cs
+++ b/MediaBrowser.Controller/Resolvers/Audio/MusicAlbumResolver.cs
@@ -1,17 +1,27 @@
using MediaBrowser.Controller.Entities.Audio;
using MediaBrowser.Controller.Library;
-using System.ComponentModel.Composition;
namespace MediaBrowser.Controller.Resolvers.Audio
{
- [Export(typeof(IBaseItemResolver))]
+ /// <summary>
+ /// Class MusicAlbumResolver
+ /// </summary>
public class MusicAlbumResolver : BaseItemResolver<MusicAlbum>
{
+ /// <summary>
+ /// Gets the priority.
+ /// </summary>
+ /// <value>The priority.</value>
public override ResolverPriority Priority
{
get { return ResolverPriority.Third; } // we need to be ahead of the generic folder resolver but behind the movie one
}
-
+
+ /// <summary>
+ /// Resolves the specified args.
+ /// </summary>
+ /// <param name="args">The args.</param>
+ /// <returns>MusicAlbum.</returns>
protected override MusicAlbum Resolve(ItemResolveArgs args)
{
if (!args.IsDirectory) return null;
diff --git a/MediaBrowser.Controller/Resolvers/Audio/MusicArtistResolver.cs b/MediaBrowser.Controller/Resolvers/Audio/MusicArtistResolver.cs
index 8060e8d33..45f96d3ab 100644
--- a/MediaBrowser.Controller/Resolvers/Audio/MusicArtistResolver.cs
+++ b/MediaBrowser.Controller/Resolvers/Audio/MusicArtistResolver.cs
@@ -1,18 +1,28 @@
using MediaBrowser.Controller.Entities.Audio;
using MediaBrowser.Controller.Library;
-using System.ComponentModel.Composition;
using System.Linq;
namespace MediaBrowser.Controller.Resolvers.Audio
{
- [Export(typeof(IBaseItemResolver))]
+ /// <summary>
+ /// Class MusicArtistResolver
+ /// </summary>
public class MusicArtistResolver : BaseItemResolver<MusicArtist>
{
+ /// <summary>
+ /// Gets the priority.
+ /// </summary>
+ /// <value>The priority.</value>
public override ResolverPriority Priority
{
get { return ResolverPriority.Third; } // we need to be ahead of the generic folder resolver but behind the movie one
}
+ /// <summary>
+ /// Resolves the specified args.
+ /// </summary>
+ /// <param name="args">The args.</param>
+ /// <returns>MusicArtist.</returns>
protected override MusicArtist Resolve(ItemResolveArgs args)
{
if (!args.IsDirectory) return null;
diff --git a/MediaBrowser.Controller/Resolvers/CoreResolutionIgnoreRule.cs b/MediaBrowser.Controller/Resolvers/CoreResolutionIgnoreRule.cs
index 2d69f8def..770b673a5 100644
--- a/MediaBrowser.Controller/Resolvers/CoreResolutionIgnoreRule.cs
+++ b/MediaBrowser.Controller/Resolvers/CoreResolutionIgnoreRule.cs
@@ -1,7 +1,6 @@
using MediaBrowser.Controller.Library;
using System;
using System.Collections.Generic;
-using System.ComponentModel.Composition;
using System.Linq;
namespace MediaBrowser.Controller.Resolvers
@@ -9,8 +8,7 @@ namespace MediaBrowser.Controller.Resolvers
/// <summary>
/// Provides the core resolver ignore rules
/// </summary>
- [Export(typeof(BaseResolutionIgnoreRule))]
- public class CoreResolutionIgnoreRule : BaseResolutionIgnoreRule
+ public class CoreResolutionIgnoreRule : IResolutionIgnoreRule
{
/// <summary>
/// Any folder named in this list will be ignored - can be added to at runtime for extensibility
@@ -27,7 +25,12 @@ namespace MediaBrowser.Controller.Resolvers
"extrafanart"
};
- public override bool ShouldIgnore(ItemResolveArgs args)
+ /// <summary>
+ /// Shoulds the ignore.
+ /// </summary>
+ /// <param name="args">The args.</param>
+ /// <returns><c>true</c> if XXXX, <c>false</c> otherwise</returns>
+ public bool ShouldIgnore(ItemResolveArgs args)
{
// Ignore hidden files and folders
if (args.IsHidden)
diff --git a/MediaBrowser.Controller/Resolvers/EntityResolutionHelper.cs b/MediaBrowser.Controller/Resolvers/EntityResolutionHelper.cs
index 75e130526..f406cb185 100644
--- a/MediaBrowser.Controller/Resolvers/EntityResolutionHelper.cs
+++ b/MediaBrowser.Controller/Resolvers/EntityResolutionHelper.cs
@@ -1,6 +1,7 @@
using MediaBrowser.Common.IO;
using MediaBrowser.Common.Win32;
using MediaBrowser.Controller.Entities;
+using MediaBrowser.Controller.IO;
using MediaBrowser.Controller.Library;
using System;
using System.Collections.Generic;
diff --git a/MediaBrowser.Controller/Resolvers/FolderResolver.cs b/MediaBrowser.Controller/Resolvers/FolderResolver.cs
index e37c18692..c356b8c84 100644
--- a/MediaBrowser.Controller/Resolvers/FolderResolver.cs
+++ b/MediaBrowser.Controller/Resolvers/FolderResolver.cs
@@ -1,13 +1,11 @@
using MediaBrowser.Controller.Entities;
using MediaBrowser.Controller.Library;
-using System.ComponentModel.Composition;
namespace MediaBrowser.Controller.Resolvers
{
/// <summary>
/// Class FolderResolver
/// </summary>
- [Export(typeof(IBaseItemResolver))]
public class FolderResolver : BaseFolderResolver<Folder>
{
/// <summary>
diff --git a/MediaBrowser.Controller/Resolvers/BaseResolutionIgnoreRule.cs b/MediaBrowser.Controller/Resolvers/IResolutionIgnoreRule.cs
index 45effc4da..661688f3c 100644
--- a/MediaBrowser.Controller/Resolvers/BaseResolutionIgnoreRule.cs
+++ b/MediaBrowser.Controller/Resolvers/IResolutionIgnoreRule.cs
@@ -5,8 +5,8 @@ namespace MediaBrowser.Controller.Resolvers
/// <summary>
/// Provides a base "rule" that anyone can use to have paths ignored by the resolver
/// </summary>
- public abstract class BaseResolutionIgnoreRule
+ public interface IResolutionIgnoreRule
{
- public abstract bool ShouldIgnore(ItemResolveArgs args);
+ bool ShouldIgnore(ItemResolveArgs args);
}
}
diff --git a/MediaBrowser.Controller/Resolvers/LocalTrailerResolver.cs b/MediaBrowser.Controller/Resolvers/LocalTrailerResolver.cs
index c26b0ce37..a61e010b3 100644
--- a/MediaBrowser.Controller/Resolvers/LocalTrailerResolver.cs
+++ b/MediaBrowser.Controller/Resolvers/LocalTrailerResolver.cs
@@ -1,7 +1,6 @@
using MediaBrowser.Controller.Entities;
using MediaBrowser.Controller.Library;
using System;
-using System.ComponentModel.Composition;
using System.IO;
namespace MediaBrowser.Controller.Resolvers
@@ -9,7 +8,6 @@ namespace MediaBrowser.Controller.Resolvers
/// <summary>
/// Class LocalTrailerResolver
/// </summary>
- [Export(typeof(IBaseItemResolver))]
public class LocalTrailerResolver : BaseVideoResolver<Trailer>
{
/// <summary>
diff --git a/MediaBrowser.Controller/Resolvers/Movies/BoxSetResolver.cs b/MediaBrowser.Controller/Resolvers/Movies/BoxSetResolver.cs
index ccca0cfab..2eee2a98b 100644
--- a/MediaBrowser.Controller/Resolvers/Movies/BoxSetResolver.cs
+++ b/MediaBrowser.Controller/Resolvers/Movies/BoxSetResolver.cs
@@ -1,7 +1,6 @@
using MediaBrowser.Controller.Entities.Movies;
using MediaBrowser.Controller.Library;
using System;
-using System.ComponentModel.Composition;
using System.IO;
namespace MediaBrowser.Controller.Resolvers.Movies
@@ -9,7 +8,6 @@ namespace MediaBrowser.Controller.Resolvers.Movies
/// <summary>
/// Class BoxSetResolver
/// </summary>
- [Export(typeof(IBaseItemResolver))]
public class BoxSetResolver : BaseFolderResolver<BoxSet>
{
/// <summary>
diff --git a/MediaBrowser.Controller/Resolvers/Movies/MovieResolver.cs b/MediaBrowser.Controller/Resolvers/Movies/MovieResolver.cs
index 14f635747..9443221a3 100644
--- a/MediaBrowser.Controller/Resolvers/Movies/MovieResolver.cs
+++ b/MediaBrowser.Controller/Resolvers/Movies/MovieResolver.cs
@@ -6,7 +6,6 @@ using MediaBrowser.Controller.Providers.Movies;
using MediaBrowser.Model.Entities;
using System;
using System.Collections.Generic;
-using System.ComponentModel.Composition;
using System.IO;
namespace MediaBrowser.Controller.Resolvers.Movies
@@ -14,7 +13,6 @@ namespace MediaBrowser.Controller.Resolvers.Movies
/// <summary>
/// Class MovieResolver
/// </summary>
- [Export(typeof(IBaseItemResolver))]
public class MovieResolver : BaseVideoResolver<Movie>
{
/// <summary>
diff --git a/MediaBrowser.Controller/Resolvers/TV/EpisodeResolver.cs b/MediaBrowser.Controller/Resolvers/TV/EpisodeResolver.cs
index f2f3ce122..d1789bcbb 100644
--- a/MediaBrowser.Controller/Resolvers/TV/EpisodeResolver.cs
+++ b/MediaBrowser.Controller/Resolvers/TV/EpisodeResolver.cs
@@ -1,14 +1,20 @@
-using System;
-using MediaBrowser.Controller.Entities.TV;
+using MediaBrowser.Controller.Entities.TV;
using MediaBrowser.Controller.Library;
-using System.ComponentModel.Composition;
using MediaBrowser.Model.Entities;
+using System;
namespace MediaBrowser.Controller.Resolvers.TV
{
- [Export(typeof(IBaseItemResolver))]
+ /// <summary>
+ /// Class EpisodeResolver
+ /// </summary>
public class EpisodeResolver : BaseVideoResolver<Episode>
{
+ /// <summary>
+ /// Resolves the specified args.
+ /// </summary>
+ /// <param name="args">The args.</param>
+ /// <returns>Episode.</returns>
protected override Episode Resolve(ItemResolveArgs args)
{
// If the parent is a Season or Series, then this is an Episode if the VideoResolver returns something
@@ -40,6 +46,11 @@ namespace MediaBrowser.Controller.Resolvers.TV
return null;
}
+ /// <summary>
+ /// Sets the initial item values.
+ /// </summary>
+ /// <param name="item">The item.</param>
+ /// <param name="args">The args.</param>
protected override void SetInitialItemValues(Episode item, ItemResolveArgs args)
{
base.SetInitialItemValues(item, args);
diff --git a/MediaBrowser.Controller/Resolvers/TV/SeasonResolver.cs b/MediaBrowser.Controller/Resolvers/TV/SeasonResolver.cs
index 6569c85bc..9ea474207 100644
--- a/MediaBrowser.Controller/Resolvers/TV/SeasonResolver.cs
+++ b/MediaBrowser.Controller/Resolvers/TV/SeasonResolver.cs
@@ -1,13 +1,19 @@
using MediaBrowser.Controller.Entities.TV;
using MediaBrowser.Controller.Library;
using System;
-using System.ComponentModel.Composition;
namespace MediaBrowser.Controller.Resolvers.TV
{
- [Export(typeof(IBaseItemResolver))]
+ /// <summary>
+ /// Class SeasonResolver
+ /// </summary>
public class SeasonResolver : BaseFolderResolver<Season>
{
+ /// <summary>
+ /// Resolves the specified args.
+ /// </summary>
+ /// <param name="args">The args.</param>
+ /// <returns>Season.</returns>
protected override Season Resolve(ItemResolveArgs args)
{
if (args.Parent is Series && args.IsDirectory)
@@ -21,6 +27,11 @@ namespace MediaBrowser.Controller.Resolvers.TV
return null;
}
+ /// <summary>
+ /// Sets the initial item values.
+ /// </summary>
+ /// <param name="item">The item.</param>
+ /// <param name="args">The args.</param>
protected override void SetInitialItemValues(Season item, ItemResolveArgs args)
{
base.SetInitialItemValues(item, args);
diff --git a/MediaBrowser.Controller/Resolvers/TV/SeriesResolver.cs b/MediaBrowser.Controller/Resolvers/TV/SeriesResolver.cs
index 7c0bc3df1..c973cfe87 100644
--- a/MediaBrowser.Controller/Resolvers/TV/SeriesResolver.cs
+++ b/MediaBrowser.Controller/Resolvers/TV/SeriesResolver.cs
@@ -3,7 +3,6 @@ using MediaBrowser.Controller.Entities.TV;
using MediaBrowser.Controller.Library;
using MediaBrowser.Model.Entities;
using System;
-using System.ComponentModel.Composition;
using System.IO;
namespace MediaBrowser.Controller.Resolvers.TV
@@ -11,7 +10,6 @@ namespace MediaBrowser.Controller.Resolvers.TV
/// <summary>
/// Class SeriesResolver
/// </summary>
- [Export(typeof(IBaseItemResolver))]
public class SeriesResolver : BaseFolderResolver<Series>
{
/// <summary>
diff --git a/MediaBrowser.Controller/Resolvers/VideoResolver.cs b/MediaBrowser.Controller/Resolvers/VideoResolver.cs
index bfb364349..5f2f8d954 100644
--- a/MediaBrowser.Controller/Resolvers/VideoResolver.cs
+++ b/MediaBrowser.Controller/Resolvers/VideoResolver.cs
@@ -2,7 +2,6 @@
using MediaBrowser.Controller.Library;
using MediaBrowser.Model.Entities;
using System;
-using System.ComponentModel.Composition;
using System.IO;
namespace MediaBrowser.Controller.Resolvers
@@ -10,7 +9,6 @@ namespace MediaBrowser.Controller.Resolvers
/// <summary>
/// Resolves a Path into a Video
/// </summary>
- [Export(typeof(IBaseItemResolver))]
public class VideoResolver : BaseVideoResolver<Video>
{
/// <summary>
diff --git a/MediaBrowser.Controller/ScheduledTasks/ChapterImagesTask.cs b/MediaBrowser.Controller/ScheduledTasks/ChapterImagesTask.cs
index d3d30ed77..1a64bb853 100644
--- a/MediaBrowser.Controller/ScheduledTasks/ChapterImagesTask.cs
+++ b/MediaBrowser.Controller/ScheduledTasks/ChapterImagesTask.cs
@@ -1,19 +1,30 @@
using MediaBrowser.Common.ScheduledTasks;
using MediaBrowser.Controller.Entities;
-using MediaBrowser.Model.Tasks;
+using MediaBrowser.Model.Logging;
using System;
using System.Collections.Generic;
-using System.ComponentModel.Composition;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
namespace MediaBrowser.Controller.ScheduledTasks
{
- [Export(typeof(IScheduledTask))]
+ /// <summary>
+ /// Class ChapterImagesTask
+ /// </summary>
class ChapterImagesTask : BaseScheduledTask<Kernel>
{
/// <summary>
+ /// Initializes a new instance of the <see cref="ChapterImagesTask" /> class.
+ /// </summary>
+ /// <param name="kernel">The kernel.</param>
+ /// <param name="logger"></param>
+ public ChapterImagesTask(Kernel kernel, ITaskManager taskManager, ILogger logger)
+ : base(kernel, taskManager, logger)
+ {
+ }
+
+ /// <summary>
/// Creates the triggers that define when the task will run
/// </summary>
/// <returns>IEnumerable{BaseTaskTrigger}.</returns>
diff --git a/MediaBrowser.Controller/ScheduledTasks/ImageCleanupTask.cs b/MediaBrowser.Controller/ScheduledTasks/ImageCleanupTask.cs
index 57fc280de..8dd0895c9 100644
--- a/MediaBrowser.Controller/ScheduledTasks/ImageCleanupTask.cs
+++ b/MediaBrowser.Controller/ScheduledTasks/ImageCleanupTask.cs
@@ -1,11 +1,9 @@
-using MediaBrowser.Common.Extensions;
-using MediaBrowser.Common.ScheduledTasks;
+using MediaBrowser.Common.ScheduledTasks;
using MediaBrowser.Controller.Entities;
using MediaBrowser.Controller.Entities.Movies;
-using MediaBrowser.Model.Tasks;
+using MediaBrowser.Model.Logging;
using System;
using System.Collections.Generic;
-using System.ComponentModel.Composition;
using System.IO;
using System.Linq;
using System.Threading;
@@ -16,10 +14,19 @@ namespace MediaBrowser.Controller.ScheduledTasks
/// <summary>
/// Class ImageCleanupTask
/// </summary>
- [Export(typeof(IScheduledTask))]
public class ImageCleanupTask : BaseScheduledTask<Kernel>
{
/// <summary>
+ /// Initializes a new instance of the <see cref="ImageCleanupTask" /> class.
+ /// </summary>
+ /// <param name="kernel">The kernel.</param>
+ /// <param name="logger"></param>
+ public ImageCleanupTask(Kernel kernel, ITaskManager taskManager, ILogger logger)
+ : base(kernel, taskManager, logger)
+ {
+ }
+
+ /// <summary>
/// Creates the triggers that define when the task will run
/// </summary>
/// <returns>IEnumerable{BaseTaskTrigger}.</returns>
diff --git a/MediaBrowser.Controller/ScheduledTasks/PeopleValidationTask.cs b/MediaBrowser.Controller/ScheduledTasks/PeopleValidationTask.cs
index 2a91f0716..ee55ff2e9 100644
--- a/MediaBrowser.Controller/ScheduledTasks/PeopleValidationTask.cs
+++ b/MediaBrowser.Controller/ScheduledTasks/PeopleValidationTask.cs
@@ -1,7 +1,7 @@
using MediaBrowser.Common.ScheduledTasks;
+using MediaBrowser.Model.Logging;
using System;
using System.Collections.Generic;
-using System.ComponentModel.Composition;
using System.Threading;
using System.Threading.Tasks;
@@ -10,10 +10,19 @@ namespace MediaBrowser.Controller.ScheduledTasks
/// <summary>
/// Class PeopleValidationTask
/// </summary>
- [Export(typeof(IScheduledTask))]
public class PeopleValidationTask : BaseScheduledTask<Kernel>
{
/// <summary>
+ /// Initializes a new instance of the <see cref="PeopleValidationTask" /> class.
+ /// </summary>
+ /// <param name="kernel">The kernel.</param>
+ /// <param name="logger"></param>
+ public PeopleValidationTask(Kernel kernel, ITaskManager taskManager, ILogger logger)
+ : base(kernel, taskManager, logger)
+ {
+ }
+
+ /// <summary>
/// Creates the triggers that define when the task will run
/// </summary>
/// <returns>IEnumerable{BaseTaskTrigger}.</returns>
diff --git a/MediaBrowser.Controller/ScheduledTasks/PluginUpdateTask.cs b/MediaBrowser.Controller/ScheduledTasks/PluginUpdateTask.cs
index 3d79193d5..854c3b82f 100644
--- a/MediaBrowser.Controller/ScheduledTasks/PluginUpdateTask.cs
+++ b/MediaBrowser.Controller/ScheduledTasks/PluginUpdateTask.cs
@@ -1,9 +1,8 @@
using MediaBrowser.Common.ScheduledTasks;
+using MediaBrowser.Model.Logging;
using MediaBrowser.Model.Net;
-using MediaBrowser.Model.Tasks;
using System;
using System.Collections.Generic;
-using System.ComponentModel.Composition;
using System.IO;
using System.Linq;
using System.Threading;
@@ -14,10 +13,19 @@ namespace MediaBrowser.Controller.ScheduledTasks
/// <summary>
/// Plugin Update Task
/// </summary>
- [Export(typeof(IScheduledTask))]
public class PluginUpdateTask : BaseScheduledTask<Kernel>
{
/// <summary>
+ /// Initializes a new instance of the <see cref="PluginUpdateTask" /> class.
+ /// </summary>
+ /// <param name="kernel">The kernel.</param>
+ /// <param name="logger"></param>
+ public PluginUpdateTask(Kernel kernel, ITaskManager taskManager, ILogger logger)
+ : base(kernel, taskManager, logger)
+ {
+ }
+
+ /// <summary>
/// Creates the triggers that define when the task will run
/// </summary>
/// <returns>IEnumerable{BaseTaskTrigger}.</returns>
diff --git a/MediaBrowser.Controller/ScheduledTasks/RefreshMediaLibraryTask.cs b/MediaBrowser.Controller/ScheduledTasks/RefreshMediaLibraryTask.cs
index f0fcb8aba..76e60f2ef 100644
--- a/MediaBrowser.Controller/ScheduledTasks/RefreshMediaLibraryTask.cs
+++ b/MediaBrowser.Controller/ScheduledTasks/RefreshMediaLibraryTask.cs
@@ -1,8 +1,8 @@
using MediaBrowser.Common.ScheduledTasks;
+using MediaBrowser.Model.Logging;
using MediaBrowser.Model.Tasks;
using System;
using System.Collections.Generic;
-using System.ComponentModel.Composition;
using System.Threading;
using System.Threading.Tasks;
@@ -11,10 +11,19 @@ namespace MediaBrowser.Controller.ScheduledTasks
/// <summary>
/// Class RefreshMediaLibraryTask
/// </summary>
- [Export(typeof(IScheduledTask))]
public class RefreshMediaLibraryTask : BaseScheduledTask<Kernel>
{
/// <summary>
+ /// Initializes a new instance of the <see cref="RefreshMediaLibraryTask" /> class.
+ /// </summary>
+ /// <param name="kernel">The kernel.</param>
+ /// <param name="logger"></param>
+ public RefreshMediaLibraryTask(Kernel kernel, ITaskManager taskManager, ILogger logger)
+ : base(kernel, taskManager, logger)
+ {
+ }
+
+ /// <summary>
/// Gets the default triggers.
/// </summary>
/// <returns>IEnumerable{BaseTaskTrigger}.</returns>
@@ -22,7 +31,7 @@ namespace MediaBrowser.Controller.ScheduledTasks
{
return new BaseTaskTrigger[] {
- new StartupTrigger(Kernel),
+ new StartupTrigger(),
new SystemEventTrigger{ SystemEvent = SystemEvent.WakeFromSleep},
diff --git a/MediaBrowser.Model/DTO/UserItemDataDto.cs b/MediaBrowser.Model/DTO/UserItemDataDto.cs
index bcfbce49e..0a362e796 100644
--- a/MediaBrowser.Model/DTO/UserItemDataDto.cs
+++ b/MediaBrowser.Model/DTO/UserItemDataDto.cs
@@ -4,7 +4,7 @@ using ProtoBuf;
namespace MediaBrowser.Model.Dto
{
/// <summary>
- /// Class DtoUserItemData
+ /// Class UserItemDataDto
/// </summary>
[ProtoContract]
public class UserItemDataDto : INotifyPropertyChanged
diff --git a/MediaBrowser.Model/MediaBrowser.Model.csproj b/MediaBrowser.Model/MediaBrowser.Model.csproj
index f445567f1..c4010e1d9 100644
--- a/MediaBrowser.Model/MediaBrowser.Model.csproj
+++ b/MediaBrowser.Model/MediaBrowser.Model.csproj
@@ -125,8 +125,7 @@
</ItemGroup>
<Import Project="$(MSBuildExtensionsPath32)\Microsoft\Portable\$(TargetFrameworkVersion)\Microsoft.Portable.CSharp.targets" />
<PropertyGroup>
- <PostBuildEvent>
- </PostBuildEvent>
+ <PostBuildEvent>xcopy "$(TargetPath)" "$(SolutionDir)\Nuget\dlls\" /y /d /r /i</PostBuildEvent>
</PropertyGroup>
<Import Project="$(SolutionDir)\.nuget\nuget.targets" />
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
diff --git a/MediaBrowser.Plugins.DefaultTheme/MediaBrowser.Plugins.DefaultTheme.csproj b/MediaBrowser.Plugins.DefaultTheme/MediaBrowser.Plugins.DefaultTheme.csproj
index 0ba40e814..f0176049d 100644
--- a/MediaBrowser.Plugins.DefaultTheme/MediaBrowser.Plugins.DefaultTheme.csproj
+++ b/MediaBrowser.Plugins.DefaultTheme/MediaBrowser.Plugins.DefaultTheme.csproj
@@ -47,7 +47,6 @@
<HintPath>..\ThirdParty\Expression\Microsoft.Expression.Interactions.dll</HintPath>
</Reference>
<Reference Include="System" />
- <Reference Include="System.ComponentModel.Composition" />
<Reference Include="System.Data" />
<Reference Include="System.Drawing" />
<Reference Include="System.Net" />
diff --git a/MediaBrowser.Plugins.DefaultTheme/Resources/AppResources.cs b/MediaBrowser.Plugins.DefaultTheme/Resources/AppResources.cs
index 81ed46217..3ca6e8df2 100644
--- a/MediaBrowser.Plugins.DefaultTheme/Resources/AppResources.cs
+++ b/MediaBrowser.Plugins.DefaultTheme/Resources/AppResources.cs
@@ -1,12 +1,11 @@
-using System.Threading.Tasks;
-using MediaBrowser.Model.Dto;
+using MediaBrowser.Model.Dto;
using MediaBrowser.Model.Net;
using MediaBrowser.UI;
using MediaBrowser.UI.Controller;
using MediaBrowser.UI.Controls;
using MediaBrowser.UI.Playback;
using MediaBrowser.UI.Playback.InternalPlayer;
-using System.ComponentModel.Composition;
+using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
@@ -15,7 +14,6 @@ namespace MediaBrowser.Plugins.DefaultTheme.Resources
/// <summary>
/// Class AppResources
/// </summary>
- [Export(typeof(ResourceDictionary))]
public partial class AppResources : ResourceDictionary
{
/// <summary>
diff --git a/MediaBrowser.Plugins.DefaultTheme/Theme.cs b/MediaBrowser.Plugins.DefaultTheme/Theme.cs
index f8d6d8724..5a730cf08 100644
--- a/MediaBrowser.Plugins.DefaultTheme/Theme.cs
+++ b/MediaBrowser.Plugins.DefaultTheme/Theme.cs
@@ -4,7 +4,6 @@ using MediaBrowser.Plugins.DefaultTheme.Resources;
using MediaBrowser.UI;
using MediaBrowser.UI.Controller;
using System.Collections.Generic;
-using System.ComponentModel.Composition;
using System.Windows;
using System.Windows.Controls;
@@ -13,7 +12,6 @@ namespace MediaBrowser.Plugins.DefaultTheme
/// <summary>
/// Class Theme
/// </summary>
- [Export(typeof(BaseTheme))]
class Theme : BaseTheme
{
/// <summary>
diff --git a/MediaBrowser.Server.Sqlite/MediaBrowser.Server.Sqlite.csproj b/MediaBrowser.Server.Sqlite/MediaBrowser.Server.Sqlite.csproj
index f4fb64ea5..22e552f8a 100644
--- a/MediaBrowser.Server.Sqlite/MediaBrowser.Server.Sqlite.csproj
+++ b/MediaBrowser.Server.Sqlite/MediaBrowser.Server.Sqlite.csproj
@@ -36,7 +36,6 @@
</PropertyGroup>
<ItemGroup>
<Reference Include="System" />
- <Reference Include="System.ComponentModel.Composition" />
<Reference Include="System.Core" />
<Reference Include="System.Data.SQLite">
<HintPath>..\packages\System.Data.SQLite.1.0.84.0\lib\net45\System.Data.SQLite.dll</HintPath>
diff --git a/MediaBrowser.Server.Sqlite/SQLiteDisplayPreferencesRepository.cs b/MediaBrowser.Server.Sqlite/SQLiteDisplayPreferencesRepository.cs
index 4ef4cf086..80d389c94 100644
--- a/MediaBrowser.Server.Sqlite/SQLiteDisplayPreferencesRepository.cs
+++ b/MediaBrowser.Server.Sqlite/SQLiteDisplayPreferencesRepository.cs
@@ -5,7 +5,6 @@ using MediaBrowser.Model.Entities;
using MediaBrowser.Model.Logging;
using System;
using System.Collections.Generic;
-using System.ComponentModel.Composition;
using System.Data;
using System.IO;
using System.Threading;
@@ -16,7 +15,6 @@ namespace MediaBrowser.Server.Sqlite
/// <summary>
/// Class SQLiteDisplayPreferencesRepository
/// </summary>
- [Export(typeof(IDisplayPreferencesRepository))]
class SQLiteDisplayPreferencesRepository : SqliteRepository, IDisplayPreferencesRepository
{
/// <summary>
@@ -40,8 +38,7 @@ namespace MediaBrowser.Server.Sqlite
/// Initializes a new instance of the <see cref="SQLiteUserDataRepository" /> class.
/// </summary>
/// <param name="logger">The logger.</param>
- [ImportingConstructor]
- protected SQLiteDisplayPreferencesRepository([Import("logger")] ILogger logger)
+ public SQLiteDisplayPreferencesRepository(ILogger logger)
: base(logger)
{
}
diff --git a/MediaBrowser.Server.Sqlite/SQLiteItemRepository.cs b/MediaBrowser.Server.Sqlite/SQLiteItemRepository.cs
index d00bd63ce..58a924bc4 100644
--- a/MediaBrowser.Server.Sqlite/SQLiteItemRepository.cs
+++ b/MediaBrowser.Server.Sqlite/SQLiteItemRepository.cs
@@ -5,7 +5,6 @@ using MediaBrowser.Controller.Persistence;
using MediaBrowser.Model.Logging;
using System;
using System.Collections.Generic;
-using System.ComponentModel.Composition;
using System.Data;
using System.IO;
using System.Threading;
@@ -16,7 +15,6 @@ namespace MediaBrowser.Server.Sqlite
/// <summary>
/// Class SQLiteItemRepository
/// </summary>
- [Export(typeof(IItemRepository))]
public class SQLiteItemRepository : SqliteRepository, IItemRepository
{
/// <summary>
@@ -45,8 +43,7 @@ namespace MediaBrowser.Server.Sqlite
/// Initializes a new instance of the <see cref="SQLiteUserDataRepository" /> class.
/// </summary>
/// <param name="logger">The logger.</param>
- [ImportingConstructor]
- protected SQLiteItemRepository([Import("logger")] ILogger logger)
+ public SQLiteItemRepository(ILogger logger)
: base(logger)
{
}
diff --git a/MediaBrowser.Server.Sqlite/SQLiteUserDataRepository.cs b/MediaBrowser.Server.Sqlite/SQLiteUserDataRepository.cs
index 732ebc06c..eaa89508a 100644
--- a/MediaBrowser.Server.Sqlite/SQLiteUserDataRepository.cs
+++ b/MediaBrowser.Server.Sqlite/SQLiteUserDataRepository.cs
@@ -4,7 +4,6 @@ using MediaBrowser.Controller.Persistence;
using MediaBrowser.Model.Logging;
using System;
using System.Collections.Generic;
-using System.ComponentModel.Composition;
using System.Data;
using System.IO;
using System.Threading;
@@ -15,7 +14,6 @@ namespace MediaBrowser.Server.Sqlite
/// <summary>
/// Class SQLiteUserDataRepository
/// </summary>
- [Export(typeof(IUserDataRepository))]
public class SQLiteUserDataRepository : SqliteRepository, IUserDataRepository
{
/// <summary>
@@ -39,8 +37,7 @@ namespace MediaBrowser.Server.Sqlite
/// Initializes a new instance of the <see cref="SQLiteUserDataRepository" /> class.
/// </summary>
/// <param name="logger">The logger.</param>
- [ImportingConstructor]
- protected SQLiteUserDataRepository([Import("logger")] ILogger logger)
+ public SQLiteUserDataRepository(ILogger logger)
: base(logger)
{
}
diff --git a/MediaBrowser.Server.Sqlite/SQLiteUserRepository.cs b/MediaBrowser.Server.Sqlite/SQLiteUserRepository.cs
index 8788a488f..6c0de2161 100644
--- a/MediaBrowser.Server.Sqlite/SQLiteUserRepository.cs
+++ b/MediaBrowser.Server.Sqlite/SQLiteUserRepository.cs
@@ -4,7 +4,6 @@ using MediaBrowser.Controller.Entities;
using MediaBrowser.Controller.Persistence;
using System;
using System.Collections.Generic;
-using System.ComponentModel.Composition;
using System.Data;
using System.IO;
using System.Threading;
@@ -16,7 +15,6 @@ namespace MediaBrowser.Server.Sqlite
/// <summary>
/// Class SQLiteUserRepository
/// </summary>
- [Export(typeof(IUserRepository))]
public class SQLiteUserRepository : SqliteRepository, IUserRepository
{
/// <summary>
@@ -40,8 +38,7 @@ namespace MediaBrowser.Server.Sqlite
/// Initializes a new instance of the <see cref="SQLiteUserDataRepository" /> class.
/// </summary>
/// <param name="logger">The logger.</param>
- [ImportingConstructor]
- protected SQLiteUserRepository([Import("logger")] ILogger logger)
+ public SQLiteUserRepository(ILogger logger)
: base(logger)
{
}
diff --git a/MediaBrowser.Server.WorldWeatherOnline/MediaBrowser.Server.WorldWeatherOnline.csproj b/MediaBrowser.Server.WorldWeatherOnline/MediaBrowser.Server.WorldWeatherOnline.csproj
index 98e973c15..0d47febed 100644
--- a/MediaBrowser.Server.WorldWeatherOnline/MediaBrowser.Server.WorldWeatherOnline.csproj
+++ b/MediaBrowser.Server.WorldWeatherOnline/MediaBrowser.Server.WorldWeatherOnline.csproj
@@ -34,7 +34,6 @@
</PropertyGroup>
<ItemGroup>
<Reference Include="System" />
- <Reference Include="System.ComponentModel.Composition" />
<Reference Include="System.Core" />
<Reference Include="System.Xml.Linq" />
<Reference Include="System.Data.DataSetExtensions" />
diff --git a/MediaBrowser.Server.WorldWeatherOnline/WeatherProvider.cs b/MediaBrowser.Server.WorldWeatherOnline/WeatherProvider.cs
index 257249793..c30a30455 100644
--- a/MediaBrowser.Server.WorldWeatherOnline/WeatherProvider.cs
+++ b/MediaBrowser.Server.WorldWeatherOnline/WeatherProvider.cs
@@ -4,7 +4,6 @@ using MediaBrowser.Controller.Weather;
using MediaBrowser.Model.Logging;
using MediaBrowser.Model.Weather;
using System;
-using System.ComponentModel.Composition;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
@@ -15,7 +14,6 @@ namespace MediaBrowser.Server.WorldWeatherOnline
/// Based on http://www.worldweatheronline.com/free-weather-feed.aspx
/// The classes in this file are a reproduction of the json output, which will then be converted to our weather model classes
/// </summary>
- [Export(typeof(IWeatherProvider))]
public class WeatherProvider : IWeatherProvider
{
/// <summary>
@@ -29,8 +27,7 @@ namespace MediaBrowser.Server.WorldWeatherOnline
/// </summary>
/// <param name="logger">The logger.</param>
/// <exception cref="System.ArgumentNullException">logger</exception>
- [ImportingConstructor]
- public WeatherProvider([Import("logger")] ILogger logger)
+ public WeatherProvider(ILogger logger)
{
if (logger == null)
{
diff --git a/MediaBrowser.ServerApplication/App.xaml.cs b/MediaBrowser.ServerApplication/App.xaml.cs
index 919898aa3..492fef242 100644
--- a/MediaBrowser.ServerApplication/App.xaml.cs
+++ b/MediaBrowser.ServerApplication/App.xaml.cs
@@ -1,13 +1,17 @@
using MediaBrowser.ClickOnce;
+using MediaBrowser.Common.IO;
using MediaBrowser.Common.Kernel;
using MediaBrowser.Controller;
using MediaBrowser.IsoMounter;
using MediaBrowser.Logging.Nlog;
+using MediaBrowser.Model.IO;
using MediaBrowser.Model.Logging;
+using MediaBrowser.Model.MediaInfo;
using MediaBrowser.Model.Updates;
using MediaBrowser.Server.Uninstall;
using MediaBrowser.ServerApplication.Implementations;
using Microsoft.Win32;
+using SimpleInjector;
using System;
using System.Diagnostics;
using System.IO;
@@ -74,6 +78,11 @@ namespace MediaBrowser.ServerApplication
public string LogFilePath { get; private set; }
/// <summary>
+ /// The container
+ /// </summary>
+ private Container _container = new Container();
+
+ /// <summary>
/// Initializes a new instance of the <see cref="App" /> class.
/// </summary>
/// <param name="logger">The logger.</param>
@@ -121,6 +130,12 @@ namespace MediaBrowser.ServerApplication
}
/// <summary>
+ /// Gets or sets the iso manager.
+ /// </summary>
+ /// <value>The iso manager.</value>
+ private IIsoManager IsoManager { get; set; }
+
+ /// <summary>
/// Gets or sets a value indicating whether [last run at startup value].
/// </summary>
/// <value><c>null</c> if [last run at startup value] contains no value, <c>true</c> if [last run at startup value]; otherwise, <c>false</c>.</value>
@@ -177,7 +192,9 @@ namespace MediaBrowser.ServerApplication
/// </summary>
protected async void LoadKernel()
{
- Kernel = new Kernel(this, new PismoIsoManager(Logger), new DotNetZipClient(), new BdInfoExaminer(), Logger);
+ RegisterResources();
+
+ Kernel = new Kernel(this, Logger);
try
{
@@ -378,7 +395,7 @@ namespace MediaBrowser.ServerApplication
NlogManager.AddFileTarget(LogFilePath, Kernel.Configuration.EnableDebugLevelLogging);
}
-
+
/// <summary>
/// Gets the image.
/// </summary>
@@ -485,5 +502,76 @@ namespace MediaBrowser.ServerApplication
{
return new ApplicationUpdater().UpdateApplication(cancellationToken, progress);
}
+
+ /// <summary>
+ /// Registers resources that classes will depend on
+ /// </summary>
+ private void RegisterResources()
+ {
+ Register<IApplicationHost>(this);
+ Register(Logger);
+
+ IsoManager = new PismoIsoManager(Logger);
+
+ Register<IIsoManager>(IsoManager);
+ Register<IBlurayExaminer>(new BdInfoExaminer());
+ Register<IZipClient>(new DotNetZipClient());
+ }
+
+ /// <summary>
+ /// Creates an instance of type and resolves all constructor dependancies
+ /// </summary>
+ /// <param name="type">The type.</param>
+ /// <returns>System.Object.</returns>
+ public object CreateInstance(Type type)
+ {
+ try
+ {
+ return _container.GetInstance(type);
+ }
+ catch
+ {
+ Logger.Error("Error creating {0}", type.Name);
+
+ throw;
+ }
+ }
+
+ /// <summary>
+ /// Registers the specified obj.
+ /// </summary>
+ /// <typeparam name="T"></typeparam>
+ /// <param name="obj">The obj.</param>
+ public void Register<T>(T obj)
+ where T : class
+ {
+ _container.RegisterSingle(obj);
+ }
+
+ /// <summary>
+ /// Resolves this instance.
+ /// </summary>
+ /// <typeparam name="T"></typeparam>
+ /// <returns>``0.</returns>
+ public T Resolve<T>()
+ {
+ return (T)_container.GetRegistration(typeof (T), true).GetInstance();
+ }
+
+ /// <summary>
+ /// Resolves this instance.
+ /// </summary>
+ /// <typeparam name="T"></typeparam>
+ /// <returns>``0.</returns>
+ public T TryResolve<T>()
+ {
+ var result = _container.GetRegistration(typeof (T), false);
+
+ if (result == null)
+ {
+ return default(T);
+ }
+ return (T)result.GetInstance();
+ }
}
}
diff --git a/MediaBrowser.ServerApplication/MediaBrowser.ServerApplication.csproj b/MediaBrowser.ServerApplication/MediaBrowser.ServerApplication.csproj
index 79ced29a7..9f9b87b05 100644
--- a/MediaBrowser.ServerApplication/MediaBrowser.ServerApplication.csproj
+++ b/MediaBrowser.ServerApplication/MediaBrowser.ServerApplication.csproj
@@ -66,7 +66,7 @@
<ApplicationManifest>app.manifest</ApplicationManifest>
</PropertyGroup>
<PropertyGroup>
- <RunPostBuildEvent>Always</RunPostBuildEvent>
+ <RunPostBuildEvent>OnBuildSuccess</RunPostBuildEvent>
</PropertyGroup>
<PropertyGroup>
<ManifestCertificateThumbprint>9633DCDB4A07D3328EFB99299C6DFB1823EBC4BE</ManifestCertificateThumbprint>
@@ -128,6 +128,10 @@
<SpecificVersion>False</SpecificVersion>
<HintPath>..\ThirdParty\UPnP\Libs\Platinum.Managed.dll</HintPath>
</Reference>
+ <Reference Include="SimpleInjector, Version=2.0.0.0, Culture=neutral, PublicKeyToken=984cb50dea722e99, processorArchitecture=MSIL">
+ <SpecificVersion>False</SpecificVersion>
+ <HintPath>..\packages\SimpleInjector.2.0.0-beta5\lib\net40-client\SimpleInjector.dll</HintPath>
+ </Reference>
<Reference Include="System" />
<Reference Include="System.Configuration" />
<Reference Include="System.Data" />
@@ -373,7 +377,22 @@
<ItemGroup />
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<PropertyGroup>
- <PostBuildEvent>xcopy "$(SolutionDir)\packages\System.Data.SQLite.1.0.84.0\content\net40\x86\SQLite.Interop.dll" "$(TargetDir)" /y</PostBuildEvent>
+ <PostBuildEvent>xcopy "$(SolutionDir)\packages\System.Data.SQLite.1.0.84.0\content\net40\x86\SQLite.Interop.dll" "$(TargetDir)" /y
+
+if $(ConfigurationName) == Release (
+xcopy "$(TargetDir)*.dll" "$(SolutionDir)..\Deploy\Server\System" /y
+mkdir "$(SolutionDir)..\Deploy\Server\System\x64"
+xcopy "$(TargetDir)x64" "$(SolutionDir)..\Deploy\Server\System\x64" /y
+
+mkdir "$(SolutionDir)..\Deploy\Server\System\x86"
+xcopy "$(TargetDir)x86" "$(SolutionDir)..\Deploy\Server\System\x86" /y
+
+mkdir "$(SolutionDir)..\Deploy\Server\System\CorePlugins"
+xcopy "$(TargetDir)CorePlugins" "$(SolutionDir)..\Deploy\Server\System\CorePlugins" /y
+
+del "$(SolutionDir)..\Deploy\MBServer.zip"
+"$(SolutionDir)7za" a -tzip "$(SolutionDir)..\Deploy\MBServer.zip" "$(SolutionDir)..\Deploy\Server\*"
+)</PostBuildEvent>
</PropertyGroup>
<Import Project="$(SolutionDir)\.nuget\nuget.targets" />
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
diff --git a/MediaBrowser.ServerApplication/packages.config b/MediaBrowser.ServerApplication/packages.config
index c9cf3ee00..e1beae6da 100644
--- a/MediaBrowser.ServerApplication/packages.config
+++ b/MediaBrowser.ServerApplication/packages.config
@@ -3,5 +3,6 @@
<package id="DotNetZip" version="1.9.1.8" targetFramework="net45" />
<package id="Hardcodet.Wpf.TaskbarNotification" version="1.0.4.0" targetFramework="net45" />
<package id="NLog" version="2.0.0.2000" targetFramework="net45" />
+ <package id="SimpleInjector" version="2.0.0-beta5" targetFramework="net45" />
<package id="System.Data.SQLite" version="1.0.84.0" targetFramework="net45" />
</packages> \ No newline at end of file
diff --git a/MediaBrowser.UI.Controls/MediaBrowser.UI.Controls.csproj b/MediaBrowser.UI.Controls/MediaBrowser.UI.Controls.csproj
index c6eb064f3..ee8d2dca7 100644
--- a/MediaBrowser.UI.Controls/MediaBrowser.UI.Controls.csproj
+++ b/MediaBrowser.UI.Controls/MediaBrowser.UI.Controls.csproj
@@ -97,6 +97,9 @@
</Page>
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
+ <PropertyGroup>
+ <PostBuildEvent>xcopy "$(TargetPath)" "$(SolutionDir)\Nuget\dlls\" /y /d /r /i</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">
diff --git a/MediaBrowser.UI/App.xaml.cs b/MediaBrowser.UI/App.xaml.cs
index b98ce8e6c..bcaa0529e 100644
--- a/MediaBrowser.UI/App.xaml.cs
+++ b/MediaBrowser.UI/App.xaml.cs
@@ -118,6 +118,17 @@ namespace MediaBrowser.UI
}
/// <summary>
+ /// The container
+ /// </summary>
+ private SimpleInjector.Container _container = new SimpleInjector.Container();
+
+ /// <summary>
+ /// Gets or sets the iso manager.
+ /// </summary>
+ /// <value>The iso manager.</value>
+ private IIsoManager IsoManager { get; set; }
+
+ /// <summary>
/// Gets the instance.
/// </summary>
/// <value>The instance.</value>
@@ -290,15 +301,6 @@ namespace MediaBrowser.UI
InitializeComponent();
}
-
- /// <summary>
- /// Instantiates the kernel.
- /// </summary>
- /// <returns>IKernel.</returns>
- protected IKernel InstantiateKernel()
- {
- return new UIKernel(this, new PismoIsoManager(Logger), Logger);
- }
/// <summary>
/// Instantiates the main window.
@@ -405,7 +407,9 @@ namespace MediaBrowser.UI
// Without this the app will shutdown after the splash screen closes
ShutdownMode = ShutdownMode.OnExplicitShutdown;
- Kernel = InstantiateKernel();
+ RegisterResources();
+
+ Kernel = new UIKernel(this, Logger);
try
{
@@ -614,7 +618,8 @@ namespace MediaBrowser.UI
{
try
{
- ServerConfiguration = await ApiClient.GetServerConfigurationAsync();
+ var b = Kernel;
+ //ServerConfiguration = await ApiClient.GetServerConfigurationAsync();
}
catch (HttpException ex)
{
@@ -1011,6 +1016,19 @@ namespace MediaBrowser.UI
}
/// <summary>
+ /// Registers resources that classes will depend on
+ /// </summary>
+ private void RegisterResources()
+ {
+ Register<IApplicationHost>(this);
+ Register(Logger);
+
+ IsoManager = new PismoIsoManager(Logger);
+
+ Register<IIsoManager>(IsoManager);
+ }
+
+ /// <summary>
/// Updates the application.
/// </summary>
/// <param name="cancellationToken">The cancellation token.</param>
@@ -1020,5 +1038,61 @@ namespace MediaBrowser.UI
{
return new ApplicationUpdater().UpdateApplication(cancellationToken, progress);
}
+
+ /// <summary>
+ /// Creates an instance of type and resolves all constructor dependancies
+ /// </summary>
+ /// <param name="type">The type.</param>
+ /// <returns>System.Object.</returns>
+ public object CreateInstance(Type type)
+ {
+ try
+ {
+ return _container.GetInstance(type);
+ }
+ catch
+ {
+ Logger.Error("Error creating {0}", type.Name);
+
+ throw;
+ }
+ }
+
+ /// <summary>
+ /// Registers the specified obj.
+ /// </summary>
+ /// <typeparam name="T"></typeparam>
+ /// <param name="obj">The obj.</param>
+ public void Register<T>(T obj)
+ where T : class
+ {
+ _container.RegisterSingle(obj);
+ }
+
+ /// <summary>
+ /// Resolves this instance.
+ /// </summary>
+ /// <typeparam name="T"></typeparam>
+ /// <returns>``0.</returns>
+ public T Resolve<T>()
+ {
+ return (T)_container.GetRegistration(typeof(T), true).GetInstance();
+ }
+
+ /// <summary>
+ /// Resolves this instance.
+ /// </summary>
+ /// <typeparam name="T"></typeparam>
+ /// <returns>``0.</returns>
+ public T TryResolve<T>()
+ {
+ var result = _container.GetRegistration(typeof(T), false);
+
+ if (result == null)
+ {
+ return default(T);
+ }
+ return (T)result.GetInstance();
+ }
}
}
diff --git a/MediaBrowser.UI/Controller/UIKernel.cs b/MediaBrowser.UI/Controller/UIKernel.cs
index 1bed49cf9..118067140 100644
--- a/MediaBrowser.UI/Controller/UIKernel.cs
+++ b/MediaBrowser.UI/Controller/UIKernel.cs
@@ -1,5 +1,4 @@
using MediaBrowser.ApiInteraction;
-using MediaBrowser.Common.IO;
using MediaBrowser.Common.Kernel;
using MediaBrowser.Model.Connectivity;
using MediaBrowser.Model.Logging;
@@ -8,7 +7,6 @@ using MediaBrowser.UI.Configuration;
using MediaBrowser.UI.Playback;
using System;
using System.Collections.Generic;
-using System.ComponentModel.Composition;
using System.Net;
using System.Net.Cache;
using System.Net.Http;
@@ -42,8 +40,8 @@ namespace MediaBrowser.UI.Controller
/// <summary>
/// Initializes a new instance of the <see cref="UIKernel" /> class.
/// </summary>
- public UIKernel(IApplicationHost appHost, IIsoManager isoManager, ILogger logger)
- : base(appHost, isoManager, logger)
+ public UIKernel(IApplicationHost appHost, ILogger logger)
+ : base(appHost, logger)
{
Instance = this;
}
@@ -52,14 +50,12 @@ namespace MediaBrowser.UI.Controller
/// Gets the media players.
/// </summary>
/// <value>The media players.</value>
- [ImportMany(typeof(BaseMediaPlayer))]
public IEnumerable<BaseMediaPlayer> MediaPlayers { get; private set; }
/// <summary>
/// Gets the list of currently loaded themes
/// </summary>
/// <value>The themes.</value>
- [ImportMany(typeof(BaseTheme))]
public IEnumerable<BaseTheme> Themes { get; private set; }
/// <summary>
@@ -132,14 +128,17 @@ namespace MediaBrowser.UI.Controller
}
/// <summary>
- /// Reloads the internal.
+ /// Finds the parts.
/// </summary>
- /// <returns>Task.</returns>
- protected override Task ReloadInternal()
+ /// <param name="allTypes">All types.</param>
+ protected override void FindParts(Type[] allTypes)
{
- PlaybackManager = new PlaybackManager(this, Logger);
+ PlaybackManager = (PlaybackManager)ApplicationHost.CreateInstance(typeof(PlaybackManager));
+
+ base.FindParts(allTypes);
- return base.ReloadInternal();
+ Themes = GetExports<BaseTheme>(allTypes);
+ MediaPlayers = GetExports<BaseMediaPlayer>(allTypes);
}
/// <summary>
diff --git a/MediaBrowser.UI/MediaBrowser.UI.csproj b/MediaBrowser.UI/MediaBrowser.UI.csproj
index 798bf461a..1f8469cbc 100644
--- a/MediaBrowser.UI/MediaBrowser.UI.csproj
+++ b/MediaBrowser.UI/MediaBrowser.UI.csproj
@@ -5,7 +5,7 @@
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ProjectGuid>{B5ECE1FB-618E-420B-9A99-8E972D76920A}</ProjectGuid>
- <OutputType>Library</OutputType>
+ <OutputType>WinExe</OutputType>
<AppDesignerFolder>Properties</AppDesignerFolder>
<RootNamespace>MediaBrowser.UI</RootNamespace>
<AssemblyName>MediaBrowser.UI</AssemblyName>
@@ -86,6 +86,10 @@
<PlatformTarget>x86</PlatformTarget>
<OutputPath>bin\x86\Release\</OutputPath>
</PropertyGroup>
+ <PropertyGroup />
+ <PropertyGroup>
+ <NoWin32Manifest>true</NoWin32Manifest>
+ </PropertyGroup>
<ItemGroup>
<Reference Include="Declarations">
<HintPath>..\ThirdParty\Taygeta\Declarations.dll</HintPath>
@@ -114,8 +118,10 @@
<SpecificVersion>False</SpecificVersion>
<HintPath>..\packages\protobuf-net.2.0.0.621\lib\net40\protobuf-net.dll</HintPath>
</Reference>
+ <Reference Include="SimpleInjector">
+ <HintPath>..\packages\SimpleInjector.2.0.0-beta5\lib\net40-client\SimpleInjector.dll</HintPath>
+ </Reference>
<Reference Include="System" />
- <Reference Include="System.ComponentModel.Composition" />
<Reference Include="System.Data" />
<Reference Include="System.Drawing" />
<Reference Include="System.Net" />
@@ -1311,6 +1317,9 @@
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<Import Project="$(SolutionDir)\.nuget\nuget.targets" />
+ <PropertyGroup>
+ <PostBuildEvent>xcopy "$(TargetPath)" "$(SolutionDir)\Nuget\dlls\" /y /d /r /i</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">
diff --git a/MediaBrowser.UI/Playback/ExternalPlayer/GenericExternalPlayer.cs b/MediaBrowser.UI/Playback/ExternalPlayer/GenericExternalPlayer.cs
index 3efb28d22..915028050 100644
--- a/MediaBrowser.UI/Playback/ExternalPlayer/GenericExternalPlayer.cs
+++ b/MediaBrowser.UI/Playback/ExternalPlayer/GenericExternalPlayer.cs
@@ -1,5 +1,4 @@
using MediaBrowser.Model.Dto;
-using System.ComponentModel.Composition;
using MediaBrowser.Model.Logging;
namespace MediaBrowser.UI.Playback.ExternalPlayer
@@ -7,11 +6,9 @@ namespace MediaBrowser.UI.Playback.ExternalPlayer
/// <summary>
/// Class GenericExternalPlayer
/// </summary>
- [Export(typeof(BaseMediaPlayer))]
public class GenericExternalPlayer : BaseExternalPlayer
{
- [ImportingConstructor]
- public GenericExternalPlayer([Import("logger")] ILogger logger)
+ public GenericExternalPlayer(ILogger logger)
: base(logger)
{
}
diff --git a/MediaBrowser.UI/Playback/NVlc/InternalMediaPlayerNVlc.cs b/MediaBrowser.UI/Playback/NVlc/InternalMediaPlayerNVlc.cs
index 7233eb64f..2d596655b 100644
--- a/MediaBrowser.UI/Playback/NVlc/InternalMediaPlayerNVlc.cs
+++ b/MediaBrowser.UI/Playback/NVlc/InternalMediaPlayerNVlc.cs
@@ -9,7 +9,6 @@ using MediaBrowser.UI.Configuration;
using MediaBrowser.UI.Playback.InternalPlayer;
using System;
using System.Collections.Generic;
-using System.ComponentModel.Composition;
using System.Drawing;
using System.IO;
using System.Linq;
@@ -21,11 +20,9 @@ namespace MediaBrowser.UI.Playback.NVlc
/// <summary>
/// Class InternalMediaPlayer
/// </summary>
- [Export(typeof(BaseMediaPlayer))]
public class InternalMediaPlayerNVlc : BaseInternalMediaPlayer
{
- [ImportingConstructor]
- public InternalMediaPlayerNVlc([Import("logger")] ILogger logger)
+ public InternalMediaPlayerNVlc(ILogger logger)
: base(logger)
{
}
diff --git a/MediaBrowser.UI/packages.config b/MediaBrowser.UI/packages.config
index 14ccb1e02..3de1bc355 100644
--- a/MediaBrowser.UI/packages.config
+++ b/MediaBrowser.UI/packages.config
@@ -3,4 +3,5 @@
<package id="MahApps.Metro" version="0.10.1.21-ALPHA" targetFramework="net45" />
<package id="NLog" version="2.0.0.2000" targetFramework="net45" />
<package id="protobuf-net" version="2.0.0.621" targetFramework="net45" />
+ <package id="SimpleInjector" version="2.0.0-beta5" targetFramework="net45" />
</packages> \ No newline at end of file
diff --git a/MediaBrowser.WebDashboard/Api/DashboardInfoWebSocketListener.cs b/MediaBrowser.WebDashboard/Api/DashboardInfoWebSocketListener.cs
index 4b9c0bd10..9d42b10ae 100644
--- a/MediaBrowser.WebDashboard/Api/DashboardInfoWebSocketListener.cs
+++ b/MediaBrowser.WebDashboard/Api/DashboardInfoWebSocketListener.cs
@@ -1,4 +1,5 @@
using MediaBrowser.Common.Kernel;
+using MediaBrowser.Common.ScheduledTasks;
using MediaBrowser.Controller;
using MediaBrowser.Model.Logging;
using System.ComponentModel.Composition;
@@ -27,15 +28,21 @@ namespace MediaBrowser.WebDashboard.Api
private readonly Kernel _kernel;
/// <summary>
+ /// Gets or sets the task manager.
+ /// </summary>
+ /// <value>The task manager.</value>
+ private readonly ITaskManager _taskManager;
+
+ /// <summary>
/// Initializes a new instance of the <see cref="DashboardInfoWebSocketListener" /> class.
/// </summary>
/// <param name="kernel">The kernel.</param>
/// <param name="logger">The logger.</param>
- [ImportingConstructor]
- public DashboardInfoWebSocketListener([Import("kernel")] Kernel kernel, [Import("logger")] ILogger logger)
+ public DashboardInfoWebSocketListener(Kernel kernel, ILogger logger, ITaskManager taskManager)
: base(logger)
{
_kernel = kernel;
+ _taskManager = taskManager;
}
/// <summary>
@@ -45,7 +52,7 @@ namespace MediaBrowser.WebDashboard.Api
/// <returns>Task{IEnumerable{TaskInfo}}.</returns>
protected override Task<DashboardInfo> GetDataToSend(object state)
{
- return Task.FromResult(DashboardService.GetDashboardInfo(_kernel, Logger));
+ return Task.FromResult(DashboardService.GetDashboardInfo(_kernel, Logger, _taskManager));
}
}
}
diff --git a/MediaBrowser.WebDashboard/Api/DashboardService.cs b/MediaBrowser.WebDashboard/Api/DashboardService.cs
index 7bf5bbab7..aca931306 100644
--- a/MediaBrowser.WebDashboard/Api/DashboardService.cs
+++ b/MediaBrowser.WebDashboard/Api/DashboardService.cs
@@ -79,6 +79,21 @@ namespace MediaBrowser.WebDashboard.Api
public class DashboardService : BaseRestService
{
/// <summary>
+ /// Gets or sets the task manager.
+ /// </summary>
+ /// <value>The task manager.</value>
+ private readonly ITaskManager _taskManager;
+
+ /// <summary>
+ /// Initializes a new instance of the <see cref="DashboardService" /> class.
+ /// </summary>
+ /// <param name="taskManager">The task manager.</param>
+ public DashboardService(ITaskManager taskManager)
+ {
+ _taskManager = taskManager;
+ }
+
+ /// <summary>
/// Adds the routes.
/// </summary>
/// <param name="appHost">The app host.</param>
@@ -98,7 +113,7 @@ namespace MediaBrowser.WebDashboard.Api
{
var kernel = (Kernel)Kernel;
- return GetDashboardInfo(kernel, Logger);
+ return GetDashboardInfo(kernel, Logger, _taskManager);
}
/// <summary>
@@ -106,8 +121,9 @@ namespace MediaBrowser.WebDashboard.Api
/// </summary>
/// <param name="kernel">The kernel.</param>
/// <param name="logger">The logger.</param>
+ /// <param name="taskManager">The task manager.</param>
/// <returns>DashboardInfo.</returns>
- public static DashboardInfo GetDashboardInfo(Kernel kernel, ILogger logger)
+ public static DashboardInfo GetDashboardInfo(Kernel kernel, ILogger logger, ITaskManager taskManager)
{
var connections = kernel.UserManager.ActiveConnections.ToArray();
@@ -117,11 +133,11 @@ namespace MediaBrowser.WebDashboard.Api
{
SystemInfo = kernel.GetSystemInfo(),
- RunningTasks = kernel.ScheduledTasks.Where(i => i.State == TaskState.Running || i.State == TaskState.Cancelling)
+ RunningTasks = taskManager.ScheduledTasks.Where(i => i.State == TaskState.Running || i.State == TaskState.Cancelling)
.Select(ScheduledTaskHelpers.GetTaskInfo)
.ToArray(),
- ApplicationUpdateTaskId = kernel.ScheduledTasks.OfType<SystemUpdateTask>().First().Id,
+ ApplicationUpdateTaskId = taskManager.ScheduledTasks.OfType<SystemUpdateTask>().First().Id,
ActiveConnections = connections,
diff --git a/MediaBrowser.WebDashboard/Html/css/images/mblogoblackfull.png b/MediaBrowser.WebDashboard/Html/css/images/mblogoblackfull.png
deleted file mode 100644
index 340f12d9d..000000000
--- a/MediaBrowser.WebDashboard/Html/css/images/mblogoblackfull.png
+++ /dev/null
Binary files differ
diff --git a/MediaBrowser.WebDashboard/Html/css/images/mblogoicon.png b/MediaBrowser.WebDashboard/Html/css/images/mblogoicon.png
new file mode 100644
index 000000000..be2de69d1
--- /dev/null
+++ b/MediaBrowser.WebDashboard/Html/css/images/mblogoicon.png
Binary files differ
diff --git a/MediaBrowser.WebDashboard/Html/css/images/mblogotextblack.png b/MediaBrowser.WebDashboard/Html/css/images/mblogotextblack.png
new file mode 100644
index 000000000..cd22f437f
--- /dev/null
+++ b/MediaBrowser.WebDashboard/Html/css/images/mblogotextblack.png
Binary files differ
diff --git a/MediaBrowser.WebDashboard/Html/css/images/mblogotextwhite.png b/MediaBrowser.WebDashboard/Html/css/images/mblogotextwhite.png
new file mode 100644
index 000000000..b1a7c8fc7
--- /dev/null
+++ b/MediaBrowser.WebDashboard/Html/css/images/mblogotextwhite.png
Binary files differ
diff --git a/MediaBrowser.WebDashboard/Html/css/images/mblogowhitefull.png b/MediaBrowser.WebDashboard/Html/css/images/mblogowhitefull.png
deleted file mode 100644
index 48c8f72d3..000000000
--- a/MediaBrowser.WebDashboard/Html/css/images/mblogowhitefull.png
+++ /dev/null
Binary files differ
diff --git a/MediaBrowser.WebDashboard/Html/css/site.css b/MediaBrowser.WebDashboard/Html/css/site.css
index c9b2089c7..32818e3cc 100644
--- a/MediaBrowser.WebDashboard/Html/css/site.css
+++ b/MediaBrowser.WebDashboard/Html/css/site.css
@@ -1,897 +1,816 @@
-@font-face {
- font-family: "Open Sans";
- font-style: normal;
- font-weight: 700;
- src: local("Open Sans Bold"), local("OpenSans-Bold"), url(http://themes.googleusercontent.com/static/fonts/opensans/v6/k3k702ZOKiLJc3WVjuplzJ1r3JsPcQLi8jytr04NNhU.woff) format('woff');
-}
-
-@font-face {
- font-family: "Open Sans";
- font-style: normal;
- font-weight: 300;
- src: local("Open Sans Light"), local("OpenSans-Light"), url(http://themes.googleusercontent.com/static/fonts/opensans/v6/DXI1ORHCpsQm3Vp6mXoaTZ1r3JsPcQLi8jytr04NNhU.woff) format('woff');
-}
-
-@font-face {
- font-family: "Open Sans";
- font-style: normal;
- font-weight: 800;
- src: local("Open Sans Extrabold"), local("OpenSans-Extrabold"), url(http://themes.googleusercontent.com/static/fonts/opensans/v6/EInbV5DfGHOiMmvb1Xr-hp1r3JsPcQLi8jytr04NNhU.woff) format('woff');
-}
-
-@font-face {
- font-family: "Open Sans";
- font-style: normal;
- font-weight: 400;
- src: local("Open Sans"), local("OpenSans"), url(http://themes.googleusercontent.com/static/fonts/opensans/v6/K88pR3goAWT7BTt32Z01mz8E0i7KZn-EPnyo3HZu7kw.woff) format('woff');
-}
-
-body {
- overflow-y: scroll!important;
-}
-
-h1 {
- font-family: 'Segoe UI Light', 'Open Sans', Arial, Helvetica, sans-serif;
- font-weight: 200;
- font-size: 32pt;
-}
-
-.toolsSidebar h1 {
- font-size: 42pt;
-}
-
-.ui-loader h1 {
- font-weight: bold;
- font-family: Arial;
-}
-
-h2 {
- font-family: 'Segoe UI Semiight', 'Open Sans', Arial, Helvetica, sans-serif;
- font-weight: 400;
- font-size: 22pt;
-}
-
-pre, textarea.pre {
- display: block;
- padding: 8.5px;
- font-size: 12.025px;
- line-height: 18px;
- word-break: break-all;
- word-wrap: break-word;
- white-space: pre;
- white-space: pre-wrap;
- background-color: #f5f5f5;
- border: 1px solid #ccc;
- border: 1px solid rgba(0, 0, 0, 0.15);
- -webkit-border-radius: 4px;
- -moz-border-radius: 4px;
- border-radius: 4px;
- font-family: Menlo, Monaco, Consolas, "Courier New", monospace;
- color: #000;
-}
-
-.type-interior h2 {
- color: #1B58B8;
-}
-
-/*
- Page / Base styles
- */
-.page {
- background: #f2f2f2;
- background-attachment: fixed;
-}
-
-.libraryPage {
- background: #1d1d1d url(images/bg.png) top left repeat-x;
- background: #262626!important;
- background-attachment: fixed!important;
-}
-
- .libraryPage .interiorLink {
- color: #2489ce;
- font-weight: bold;
- }
-
-/*
- Header
- */
-.header {
- padding: 10px 0 10px 10px;
-}
-
-.imgLogo {
- height: 45px;
-}
-
-
-.ui-popup-container {
- z-index: 99999;
-}
-
-.headerButtons {
- float: right;
- position: absolute;
- top: 10px;
- right: 10px;
-}
-
-.header .imageLink {
- display: inline-block;
-}
-
-.imageLink + .imageLink {
- margin-left: 30px;
-}
-
-.header .imageLink img {
- height: 32px;
- vertical-align: middle;
-}
-
-.btnCurrentUser {
- text-decoration: none;
-}
-
-.currentUsername {
- margin-right: 7px;
- font-size: 20px;
- color: #000;
- position: relative;
- top: 4px;
-}
-
-.libraryPage .currentUsername {
- color: #fff;
-}
-
-h1 .imageLink {
- margin-left: 15px;
-}
-
- h1 .imageLink img {
- height: 32px;
- }
-
-.imageLink:hover {
- opacity: .5;
-}
-
-.type-home h1 {
- margin-top: 1.25em;
- margin-bottom: 10px;
- padding-bottom: 5px;
- font-weight: normal;
- border-bottom: 1px solid #777;
-}
-
-.libraryPage .ui-content > h1:first-child {
- margin-top: 0;
-}
-
-.pageTitle {
- margin-top: 0;
-}
-
-.imageButton {
- background: transparent;
- border: 0;
- padding: 0;
- cursor: pointer;
- cursor: hand;
-}
-
- .imageButton:hover {
- opacity: .5;
- }
-
- .imageButton[disabled], .imageButton[disabled]:hover {
- opacity: .3!important;
- cursor: default;
- }
-
-/*
- Forms
- */
-form, .readOnlyContent {
- max-width: 600px;
-}
-
-.fieldDescription {
- font-size: 11px;
- padding-left: 5px;
-}
-
-.ulForm {
- margin-bottom: 20px!important;
-}
-
- .ulForm li:not(.ui-li-divider) {
- background: none;
- border-top: none;
- border-bottom: none;
- }
-
-.popup .ulForm {
- margin-bottom: 0!important;
-}
-
-.popup .ui-content {
- padding: 20px;
-}
-
-.content-secondary {
- z-index: 99996;
- background: #262626;
- border: 0;
- margin-top: 40px;
-}
-
- .content-secondary h1 {
- margin: 0;
- padding: 20px 0 20px 30px;
- color: #fff;
- }
-
-.sidebarLinks a {
- display: block;
- padding: 12px 15px 12px 30px;
- text-decoration: none;
- color: #fff!important;
- text-shadow: none!important;
- font-weight: normal!important;
- font-size: 17px;
-}
-
- .sidebarLinks a:hover {
- background: #f2f2f2;
- color: #000!important;
- }
-
- .sidebarLinks a.selectedSidebarLink {
- background: #2572EB!important;
- color: #fff!important;
- }
-
-/* Tabs (e.g. advanced metadata page) */
-.localnav {
- margin-bottom: 40px!important;
-}
-
- .localnav + form {
- margin-top: -10px;
- }
-
-.page > .ui-content {
- padding-bottom: 100px;
-}
-
-@media all and (min-width: 650px) {
-
- .imgLogo {
- height: 60px;
- }
-
- .header {
- padding-left: 30px;
- padding-top: 20px;
- padding-bottom: 15px;
- }
-
- .headerButtons {
- top: 20px;
- right: 30px;
- }
-
- .localnav .ui-btn-inner {
- font-size: 16px;
- }
-
- .libraryPage .ui-content {
- padding-right: 50px;
- padding-left: 50px;
- }
-
- .type-interior > .ui-content {
- padding-right: 0;
- padding-left: 0;
- padding-top: 0;
- overflow: hidden;
- }
-
- .content-secondary {
- text-align: left;
- width: 45%;
- position: fixed;
- top: 0;
- left: 0;
- bottom: 0;
- margin: 0;
- }
-
- .content-primary {
- width: 45%;
- float: right;
- padding: 0 6% 3em 0;
- margin: 0;
- }
-
- .content-primary ul:first-child {
- margin-top: 0;
- }
-}
-
-@media all and (min-width: 750px) {
-
- .content-secondary {
- width: 34%;
- }
-
- .content-primary {
- width: 56%;
- }
-}
-
-@media all and (min-width: 1200px) {
-
-
- .content-secondary {
- width: 30%;
- }
-
- .content-primary {
- width: 60%;
- }
-}
-
-@media all and (min-width: 1440px) {
-
-
- .content-secondary {
- width: 25%;
- }
-
- .content-primary {
- width: 65%;
- }
-}
-
-@media all and (min-width: 1920px) {
-
-
- .content-secondary {
- width: 20%;
- }
-
- .content-primary {
- width: 70%;
- }
-}
-
-/*
- Media Library Page
- */
-.mediaFolderButtons {
- margin-top: 10px;
-}
-
-.mediaFolderLocations {
- margin: 1em .25em!important;
-}
-
-.mediaLocationsHeader {
- padding-top: .75em!important;
- padding-bottom: .75em!important;
-}
-
- .mediaLocationsHeader .ui-btn {
- position: absolute;
- right: 3px;
- margin-top: 0!important;
- margin-bottom: 0!important;
- top: 6px;
- }
-
-#divVirtualFolders .ui-btn-inner, .mediaLocationsHeader, #divVirtualFolders .ui-btn-text {
- font-size: 14px;
-}
-
-#ulDirectoryPickerList a {
- padding-top: .4em;
- padding-bottom: .4em;
- font-size: 15px;
-}
-
-/*
- Plugin updates Page
- */
-#pluginUpdatesForm table {
- width: 100%;
-}
-
-#pluginUpdatesForm td + td {
- text-align: center;
-}
-
-
-/*
- List Vew Items
- */
-
-.posterViewItem {
- display: inline-block;
- margin: 5px;
- text-align: center;
- font-size: 15px;
- padding: 0;
- position: relative;
- padding-bottom: 28px;
-}
-
- .posterViewItem a {
- color: white!important;
- font-weight: normal!important;
- text-decoration: none;
- }
-
- .posterViewItem img {
- max-width: 155px;
- max-height: 148px;
- vertical-align: bottom;
- }
-
-.premiumBanner img {
- position: absolute;
- text-align: right;
- top: 0;
- right: 0;
- width: 75px!important;
- height: 75px!important;
- max-width: 75px!important;
- max-height: 75px!important;
-}
-
-.posterViewItemText {
- text-overflow: ellipsis;
- overflow: hidden;
- text-wrap: none;
- white-space: nowrap;
- margin: 0;
- padding: 4px 2px 0;
- position: absolute;
- bottom: 0;
- left: 0;
- right: 0;
- height: 24px;
- background: #181818;
- text-shadow: none;
-}
-
-.posterViewItem:hover, .userItem:hover {
- -moz-box-shadow: 0 0 20px 3px #2572EB;
- -webkit-box-shadow: 0 0 20px 3px #2572EB;
- box-shadow: 0 0 20px 3px #2572EB;
-}
-
-@media all and (min-width: 750px) {
-
- .posterViewItem {
- font-size: 16px;
- padding-bottom: 29px;
- }
-
- .posterViewItemText {
- padding-top: 5px;
- }
-
- .posterViewItem img {
- max-width: 190px;
- max-height: 190px;
- }
-}
-
-@media all and (min-width: 1200px) {
-
- .posterViewItem {
- font-size: 17px;
- }
-
- .posterViewItem img {
- max-width: 280px;
- max-height: 250px;
- }
-}
-
-@media all and (min-width: 1920px) {
-
- .posterViewItem {
- font-size: 19px;
- padding-bottom: 33px;
- }
-
- .posterViewItemText {
- height: 28px;
- }
-
- .posterViewItem img {
- max-width: 352px;
- max-height: 300px;
- }
-}
-
-.userItem {
- display: inline-block;
- margin: 5px;
- font-size: 15px;
- text-align: left;
-}
-
-.userItemImage {
- height: 100px;
- width: 100px;
- vertical-align: bottom;
-}
-
-.userItemContent {
- display: inline-block;
- height: 100px;
- width: 180px;
- float: right;
- text-shadow: none;
- font-family: 'Segoe UI Light', 'Open Sans', Arial;
-}
-
-.userItemContentInner {
- padding: 15px 5px 5px 10px;
- color: #fff;
-}
-
-.userItemHeader {
- margin: 0 0 10px;
- font-size: 16px;
- text-overflow: ellipsis;
- overflow: hidden;
- text-wrap: avoid;
- font-family: 'Segoe UI Semilight', 'Open Sans', Arial;
-}
-
-@media all and (min-width: 750px) {
-
- .userItem {
- font-size: 16px;
- }
-
- .userItemContentInner {
- padding: 30px 20px 20px;
- }
-
- .userItemImage {
- height: 140px;
- width: 140px;
- }
-
- .userItemContent {
- height: 140px;
- width: 210px;
- }
-
- .userItemHeader {
- font-size: 26px;
- }
-}
-
-@media all and (min-width: 1200px) {
-
- .userItem {
- font-size: 18px;
- }
-
- .userItemImage {
- height: 180px;
- width: 180px;
- }
-
- .userItemContent {
- height: 180px;
- width: 270px;
- }
-
- .userItemHeader {
- font-size: 32px;
- }
-}
-
-@media all and (min-width: 1920px) {
-
- .userItem {
- font-size: 20px;
- }
-
- .userItemImage {
- height: 240px;
- width: 240px;
- }
-
- .userItemContent {
- height: 240px;
- width: 360px;
- }
-
- .userItemHeader {
- font-size: 40px;
- }
-}
-
-/* Startup wizard */
-.wizardPage {
- background: #e2e2e2;
-}
-
-.wizardContent {
- max-width: 800px;
- padding: .5em 2em 1em;
- margin: 0 auto;
- background: #f2f2f2;
-}
-
-.wizardNavigation {
- text-align: right;
-}
-
-.wizardContent form {
- max-width: 100%;
-}
-
-.wizardContent p {
- margin: 2em 0;
-}
-
-.wizardContent h2 img {
- height: 35px;
- vertical-align: middle;
- margin-right: .5em;
- position: relative;
- top: -3px;
-}
-
-/* User Image */
-.imageDropZone {
- border: 2px dashed #bbb;
- -moz-border-radius: 5px;
- -webkit-border-radius: 5px;
- border-radius: 5px;
- padding: 25px;
- text-align: center;
- color: #bbb;
-}
-
-/* Dashboard home */
-.tblConnections td {
- padding: .5em 0 .5em 1.25em;
-}
-
- .tblConnections td:first-child {
- padding-left: 0;
- }
-
-.tblConnections img {
- height: 50px;
-}
-
-.clientNowPlayingImage {
- border-radius: 5px;
- border: 2px solid #ccc;
-}
-
-/* Footer */
-#footer {
- background: #5a5a5a;
- position: fixed;
- bottom: -2px;
- left: -2px;
- right: -2px;
- z-index: 99997;
-}
-
-.footerNotification {
- text-shadow: none;
- padding: .5em 1em;
- margin: 0;
- font-weight: normal;
- border-top: 1px solid #999;
-}
-
-.notificationIcon {
- height: 24px;
- margin-right: 1em;
- vertical-align: middle;
-}
-
-/*
- * Gradient Shadow
- */
-
-/* All HTML5 progress enabled browsers */
-progress {
- /* Turns off styling - not usually needed, but good to know. */
- appearance: none;
- -moz-appearance: none;
- -webkit-appearance: none;
- /* gets rid of default border in Firefox and Opera. */
- border: solid #cccccc 2px;
- border-radius: 4px;
- margin: 0;
-}
-
- /* Polyfill */
- progress[role]:after {
- background-image: none; /* removes default background from polyfill */
- }
-
-/*
- * Background of the progress bar background
- */
-
-/* Firefox and Polyfill */
-progress {
- background: #cccccc !important; /* !important only needed in polyfill */
-}
-
- /* Chrome */
- progress::-webkit-progress-bar {
- background: #cccccc;
- }
-
- /*
- * Background of the progress bar value
- */
-
- /* Firefox */
- progress::-moz-progress-bar {
- border-radius: 5px;
- background-image: -moz-linear-gradient( center bottom, rgb(43,194,83) 37%, rgb(84,240,84) 69% );
- }
-
- /* Chrome */
- progress::-webkit-progress-value {
- border-radius: 5px;
- background-image: -webkit-gradient( linear, left bottom, left top, color-stop(0, rgb(43,194,83)), color-stop(1, rgb(84,240,84)) );
- background-image: -webkit-linear-gradient( center bottom, rgb(43,194,83) 37%, rgb(84,240,84) 69% );
- }
-
- /* Polyfill */
- progress[aria-valuenow]:before {
- border-radius: 5px;
- background-image: -moz-linear-gradient( center bottom, rgb(43,194,83) 37%, rgb(84,240,84) 69% );
- background-image: -ms-linear-gradient( center bottom, rgb(43,194,83) 37%, rgb(84,240,84) 69% );
- background-image: -o-linear-gradient( center bottom, rgb(43,194,83) 37%, rgb(84,240,84) 69% );
- }
-
-/* Detail Page*/
-
-.itemDetailImage {
- max-width: 100%;
- max-height: 400px;
-}
-
-.itemImageBlock {
- vertical-align: top;
-}
-
-.itemDetailBlock {
- vertical-align: top;
- padding-top: 1em;
-}
-
- .itemDetailBlock p {
- margin-top: 0;
- }
-
-.starRating {
- background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMYAAAA6CAYAAADryyY/AAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAOwgAADsIBFShKgAAAABp0RVh0U29mdHdhcmUAUGFpbnQuTkVUIHYzLjUuMTAw9HKhAAAS+klEQVR4Xu1de1gUV54dMJmdyWRcZzWZPNZMRLIRgxhFRhOdRCRKwMQkoGZ0hCCiGOOqSdSwrpmMiE58JDOT6LpmvnE0Jk40RoOPaHjKU1QQEBB5qPgCROhmdP377vnRVVDdXe/qruqgfN/5qrpuFV333HN+t+6jbv+IMfaju7jLwV0NOGugyxRW/rVdSe2H7/fn4GfVvdzlwcG81TzU19f7hB6sJsLP1pK2qvXSqjSUyU+BewBLzGGxILp4OHfu3B3Pw/nz532CB0uNcbl+ZUBnaxqzt6zunB0XNgSm+DnQx4paw0pj8DxAFJ0zZsy4Y3morKwMuHDhAvMFHqw0hp+tedWOztZURqgue/dzGOLfuZrD9FrDQmN080CiKCwsvGN5aGxs3EEc+AIPlhnj8rmU0M6WVawLzX/owptJY6JgjAeAe81+pLLKGEIeECkpWrKEhIQ7joeKiopQ3hS+wINVxvC3Xf19XmfzBzAEh2sfsOqTSw7DEIHA/Vxj3LSnKouM4cQDCQJRk+Xn599xPDQ0NOTxhvAFHqwwht+1+vciOq/9nnXh6vtO2PrJq0lww0PAj01zhTW9MW48QByMx8aNG+8YHs6cORNBAYEg5ID2reLBCmP426+sbOq8uhKGcMfF6nfLoNMnuYY4deOa8mdBjeHGg1AUpaWldwwP6KJtcjUE/9kqHsw2hl9Lw/I5nVf+mzljBT73YOdnMcvghoFcrWFKQ9xkY4jyAIEwITZt2tTreaiqqprjagpf4MFUYxRnJvW3X0pp6rz8X0wcKTiewlrrl7bAFMFAX7O6b800hhQProLAI0av5uHQoUP96+rqmlzz7Qs8mGkMvxuNy1I7L0H8l96TwXKkLWfpu15fBVM8AvyLGT1UJhpDkgeIhLli+/btvZaH6urqVLE8+wIPphnjVM6c/vamZZ2dTRB+N5Zh3wGk9eDiMtbe+O7NyIjBYTBFPzNqDbOMIccDRr6ZELW1tQziuTl+/Phex8ORI0f6I6+drnkW+2wFD2YZw6+98Z2/2C8uZe54F8c4XMBWgJKMhK3coN9PvF1rmGQMWR5IAISzZ8864eDBg72OBxj+L3x+pbZW8mCKMS6ULwhwCP4dcZzH8S687YQb9YtvvfD842Ngil8ANI/Ka39mGEOJB1ch8J/R1rg1bty4XsPD8ePHA6TyKnfcTB7MMIZ/R8Pi9B7RL4H4lbAY5zhQXZh4CG4YDHh10M8EYyjyUFNTw6SQnZ3da3hAbZHOG0Auz2JpZvHgbWP4XateEMGL3H27iNkbpfCfSHNgXnzIZBjjl97svvWyMVTxoCSSmTNn/uB5wLhEhFI+ldLN4MHbxvDvqF+YxwvcadsA0XdjIfalcbE0iQa7/sObg35eNoYqHhBJqbEtiaKioh88Dxi3yBMTvlLehelm8OANY9CAHMH/amVyrLPg32L2eiksQJoE6haw//lwwjyu+5Ya4jQizn+PR9odXjCGZh4gGiYHPGOztLS0HywPJ0+ejHU1gFKexdLN4EGvMboLnRMpvUNxT/Wx+MBLpUkvNFfOS2qtSk7rOPfmpW6xQ9z2bryJfSXMxzk9uFKWWF+eOePTs/mz3qrNj4ssTJ9K00ZojINm4lLDnO5B+CagphFzncbwKA9U4EpAw7X+8OHDn2ZlZb0FRO7du9dnecjIyAgsLi5+4dSpU0l4hErD+xaXeKEr5VMp3ds8yBlDWOgkuj7Ze2MHXDmdFHG1PCm2rTo5Ffi0o3Z+nu3c/CZxoTuL234On7uRjH0VqJ3H7DJor046c6NqTn5L+ezNzeWz0y4Ux01vLJo1EfdLNQtNRCTjdN2/S03jZBwZY5jGA4TD9OL06dNnysrK8k+cOLEZSMvLy5uem5vrVR527do1oKSkJALfF4vvTwU+xfTxPOShSUnYrul68+16nad4EBqDou29tYXxYfXFb0y6VpG0tLkiaU372eT8GzXzCoTRW7PAFcRtr50L8cvgbBKzy2IO0sVxvSKhsK0yoeDyyVl/bCr53XsVGVOjThyMeQZ5/RlnHjKOv8AYlvGgJA6IjukFHmMKEbkL8CLUHzGt/T1Mx4jat2+fIg85OTlhx44dmwTxL8X/WFNeXp4P8RVICV8pD55I18sBXaeWhy5jtFXNHYHobVeM4EYErihuEr+0wO1nE5Eughoc68Zs7MshAek9aKuIr9rxp/DhZBBf4MFIgUOwTC8glqoNGzZ084CaZwQEbPeEiKX+h5G8yl2rlwO6TsgDX2P0qcicEdVRM/efjscW70RvSXGT4A0I3F4NsXfjDewroCqe3aiIu/XB2yNnwhSPA325GsNSHqjAjRQsIjnTCojh1qJFi9x4+O6776JwL/9UMocvClwrB3S+Kw+8Mejx4f6t68ZPbq9KvOl4bPF29KbI7hzB9QjcDpFLIw5p7jhfOL1p/qwhi5Dn0cCvKO+cMSzlgTeFnoKVuwY1ABMDHpOasPiCJA9r1qyZjOtu6hW/EZPTtVbywBuDGpj0rD3gxfEDw66VxtXpfTzRLG6K7rLiJuGLC9xxfJYyzvyO2TmcL5jWFBTYLw55HQ88AdB0k3s5Y1jKg5IQpASu5ziZYvDgwYo8PPfcc2HoWarTK3KlPOlJ15NfueAgxoOw8U2ioO7P/pMjHgu9VDKzVOvjiZ7o3SN6bQLnhS67rZzJ7AIUfxOdNzSw3yzk8XmAujn7cQHBT9D4towHTxa48H+hq5QJsXv37jyIQTUP4eHhoWiwl+oRsdQ13sqr3P/VwoNrdy2JgsYEaF7SwPq86fvdxW4welOEF0RwVfsuAheKXWzfVjmDdaMC+8DxfdG5yFM0QFO46fHJaQ0rl+5aS3hQEotrwSp9Ri8Uc8WePXt084Bxk/2uQle6Z2+kK+XbNV0PD1LjGNTnT92Zj5YdfmWT6OOKVnHT+R4QOIm8B7/FvgTKX2c2Dp+tHbMJeXkRGAnQ2lVkfKeF3STGMUzlQarAxQpW7TE0Kqlh2YXVq1cb5uHbb7/d5Cmxe0Lg3uJBboCPRHEf8MjRzyet7I7sGsVNZhCL4HoEzgvdfTsdJnBH68mptz9bM5rEQANd1B35MJcnt9UOZQb4TONBrpCFAte6j7lFt1NTUz3Gw7Zt21by5tAqbjpfrZjFztOad+H5WnhQmhJCvTS0puyjf1s/dvaN07+92SVyp6jNf5aJ3hTVBRFcq8B7RD+N2U5LYSrSenD9RMzt2VMDaDGBSQC9P/4glxfRlUcUpoSYwoOWQseAG1MDEkNMTNfiEh7lYe3atbPx/Tf1ilxLXuXOVcMBnaOVByVjgM+u+Udkjl9uWBEac6Ns+k15kYtHb+eIrl7gQrH37MfCBBzKsHVBY85LTYnTApZyNcUwbAcA1LEguRyPirlSXudBbSGLnYepGcwV33//fVNsbKzXeFi+fHkMvvOmJ0RuJO/Caz3Fgxpj8OaguUcPvDMnaMLV4pg6W7mcuCnNOYLrEbitLAail8JrSONQii2HxuzJTUGD+8bjXicAT9E9AzRnSnZSoQpjeJ0HKmCxgtVzjEwREBDgdR6wnOgEzMuqI3N4Sty+wINaY5Ao+D7+vlOjHhvWfPy1WofYBdGb9kUiuB6B80K3lb4K0UvhFaT1oHjPhNynnuj7Ou6V5gANAv4VULUOrkpjeJUHPQagazDT1AmY3JcbGBhoGg+RkZHD0J1bq7Ym05tPpes8yYMWY/Ci4Ltzf3X2aHR6j+jFI7gegQvF3rM/BSbgcApbFxTvDnfthqQ1qVT/3oYGY3iNB9eC1fP5yy+/tIwHTExMVxKvmnQ9+Xa9xigPWo1BoqA/6qmhLs/HKw9O2tkT0Z0juB6B2069DNFL4ORLzCaCLzeG7cC9vAS4dseqfidDozG8woNaQWAkmolh3bp1lvOwf//+nbz41eZH73ne5EGvMYTmeKyl+KVm1wiuXeCTIXoxRDPbCTFE4XgUa8yIaMLNvArQvCdaoI26mDX/+IxOY3iUB6mC5o+jZ4V6V0SBSX8+wwPaHM1axK6Ub9d0M3gwYowuUaQuChroHMX1CZxE7o4XcYxDCbaiiKQfEaTBO5riQYOSmk1BGTFgDI/xIFfgfBrep6AflxGFL/CwcOHCgWqFria/Uud4mwejgvCrOxIxyRHRxYTNH1MncFtJJMQvhUlIE8faJU++DVHQEju6l/M0aAyP8CBX2GrSMH3cch6wONwkLYJXky+t53iCB6PG8G/Jn5jmHMnlxE1p0gK3lUxEOofj2HbjBey7IgLHHNj5YcgGmCKIe4xS3a7gGwoeqDE8woOYAAoKCphaYJq45Txg1m6aViGrOV8tB3SeJ3gwaow+bUUTD7iLXUzgYuKmYz0C79ov5jEB+1IIRxqHonBWsCNsP8RNUz5oYqCu39QwWGN4hAexwkc3KP3CkipgqoblPKB9cUBO6FoELjxXLQd0nid4MGqMe9qLIiod0dy4wG0QuTvG45gcnmd1B589A0PQrFl6t8KKNoZHeNBS+K7nQpAME/ws5wH3USknfiN5VHOtp3gwaowfO6K6cwTXK3Bb4fNMHM/huDxgiLEAjXLrWuPWYI3hER6o4KlgjcBqHtSIV805Rjiga43yYMQYfo3fjZ3oHs2lxE3HlQVuK/wNzpPDOGYrcMfSNwYmgoxHAV2/3WfAGB7jQasYsHoHc0VcXJxlPKDhPVGsJtOaL63ne4MHQ8a4lj12qbTY9QncIfqx4sjH8W48yzrye7Bl5RPvwxQ0DYQmPGpugBsxhqd4ECtgsWNYL4pJYcWKFZbxgAXWlmoVtfB8tfnnz/MmD0aM4X89d+xOW6F4BFcncGdxC4Xekf8MhM8hD1tJjEHaGJaxJZh+OH6I3ga4AWN4jAe5gqY09PgoYvPmzZbxgDf8dpLQPSlwMU7M4MGIMfq05T6b74jg+gVetH34seOfP51D4pbFMaRLYjSr/za0guuZ0tUAN2AMj/GAnxVDmcuLH8vgMzlgETXLeIAx8pXMLUwXyyt6lI75Ag9GjHGvexRXEDeJH+JuzRp9u3j78Nzocb9Ihpgjgd/MePGBaeX/ePpIx7HROEcOv0a6O65njfo/rmdKVwPcgDE8ygNmqk7DBLgjSgaQSsd0c8t4UDK1WDrlA/d8G4bIHTt2bLcerOZBtzEa0kNHiUdwaVG3ZoXdPvDnoD1DA+6jBb7odVOa30SPP/TTxY/RfuIrD7584vOQ3RD6rY7cMCaOUTjujlnRA2L0NsD1GsNbPEyZMuVlRM7dEM0tKRMgQjMxREVFmc4DJg+O0mpmMsTHH3+8Z9CgQZJ6sIoHvcbwu5YRNkcscjsfcwi7NXPU7fQ/DeENEcFFdvq9C3oHm6aH00tQBNp/CHji2eE/D8/ZOvTv1zNH3urICWXSGMnacxxYt2ggLR6mqwGu0xhe5yEkJCR8y5YtfyeDSBmBP56ZmckImK9kOg/4sck5ao1Bhvjoo494Q6jSg9k86DbG9czQTxzRXDx6d+SMYpcPj2j73xWDNkOsr3E1xCgSPUC/jkSj1NS1SgNywhXF6RilkUGGPBNy/4ScrUO2XTkyvLU9ZwQMIIHsp1nWlie34xqaTKj5Z8n0GsMsHoYNGzYBBtmGdx5aeQOIbdEzxNAAN50HiP0TMoacedGd25aSkmJID2bxoNcY/m1ZI/Pco7gjcl8+/HTbX1cO+gQCpXWcxgH03jU9KlHDmLpTlV4g4td1oink/8ZdG7x/Y+Cqq0dCWtqzh7NuZGGfw5mvhhbhXJoaorkBrtMYlvCwfv36VTBIC5lADHiDz3QecB95YqYg85Ih0I3scT14kwe9xrjnRvaITtfoXb0nuGbDkoEfQpg0DZxGoml1Dmo/8IbgawccUvXHG4TMRP+D/lfwvvWDUy+mBze0Z4YwIa4cCm5FOk0N0dwA12kMS3nAi0mpeLZvQLSmBmw3Dhw4YDoPMEanaw321Vdf1WCmq9f14A0edBmjYldQYDseXRwYzqr3PFWTkvAQDSzxNcRQF0Mo1RBKLuENQu0QMgjVPsEfv/3ogvpvgsrbM4NhEAd+PfQ+WiaGXljSNAKuxxi+wsPixYsXfP311+VCcwQFBZnGwxdffBEorLnIEPHx8abrwZM86DGG3+WDw2Lp8aVsZ9DR95MeThGpIfrhGInYqCFcDUMGoVrHqQb58zuPzG/Y++Tp9owg9tHihxdwxqHvVz0CrsMYPsfDkiVL5mMJztNHjx5liNSm8ZCenh5LxtixY8fRxMREy/XgCR50GaPhm6ETV89/hFbiCOUeXYQ1BAlS6yOTUo0hZhAyHX0XmZDmSAUlTO43JXXeg7Q6Bj1yaZoaoscYvspDdHT0lLlz55rGA2qricnJyT6nByM86DIG95hCjWJaB5Z6j2iZGm/UEEqG4WsQ+m66B3qEonvqD2h6m0+PMe7y0FU8VAb02Nqr9KDHGEQGvQxEZFBUFna5KgnZW+m8QcgM1JNFW03vZegwxl0eekqz1+nh/wHpt113GQ6n7AAAAABJRU5ErkJggg==);
- background-position: left center;
- background-repeat: no-repeat;
- width: 24px;
- height: 20px;
- display: inline-block;
- background-size: cover;
-}
-
-.galleryImage {
- width: 120px;
- display: inline-block;
- margin: 5px;
-}
-
-.halfStarRating {
- background-position: center center;
-}
-
-.emptyStarRating {
- background-position: right center;
-}
-
-@media all and (min-width: 650px) {
- .itemImageBlock {
- display: inline-block;
- }
-
- .itemDetailImage, .itemImageBlock {
- max-width: 220px;
- }
-
- .itemDetailBlock {
- padding-top: 0;
- display: inline-block;
- width: 45%;
- padding-left: 20px;
- max-width: 800px;
- }
-
- .galleryImage {
- width: 150px;
- }
-}
-
-@media all and (min-width: 750px) {
-
- .itemDetailImage, .itemImageBlock {
- max-width: 300px;
- }
-
- .itemDetailBlock {
- padding-left: 30px;
- }
-}
-
-
-@media all and (min-width: 1200px) {
-
- .itemDetailImage, .itemImageBlock {
- max-width: 400px;
- }
-
- .itemDetailBlock {
- width: 55%;
- }
-
- .galleryImage {
- width: 200px;
- }
-}
-
-/* Now playing bar */
-#nowPlayingBar {
- padding: 10px 20px 8px;
- border-top: 1px solid #5490CC;
-}
-
-.mediaButton {
- margin: 0 20px 0 0;
- display: inline-block;
-}
-
-#mediaElement {
- margin-right: 20px;
- display: inline-block;
- position: relative;
-}
-
-.mediaButton img {
- height: 28px;
-}
-
-.itemVideo {
- position: absolute;
- z-index: 99998;
- height: auto;
- width: 180px;
- bottom: -5px;
-}
-
-@media all and (min-width: 650px) {
-
- .itemVideo {
- width: 270px;
- }
-}
+@font-face {
+ font-family: "Open Sans";
+ font-style: normal;
+ font-weight: 700;
+ src: local("Open Sans Bold"), local("OpenSans-Bold"), url(http://themes.googleusercontent.com/static/fonts/opensans/v6/k3k702ZOKiLJc3WVjuplzJ1r3JsPcQLi8jytr04NNhU.woff) format('woff');
+}
+
+@font-face {
+ font-family: "Open Sans";
+ font-style: normal;
+ font-weight: 300;
+ src: local("Open Sans Light"), local("OpenSans-Light"), url(http://themes.googleusercontent.com/static/fonts/opensans/v6/DXI1ORHCpsQm3Vp6mXoaTZ1r3JsPcQLi8jytr04NNhU.woff) format('woff');
+}
+
+@font-face {
+ font-family: "Open Sans";
+ font-style: normal;
+ font-weight: 800;
+ src: local("Open Sans Extrabold"), local("OpenSans-Extrabold"), url(http://themes.googleusercontent.com/static/fonts/opensans/v6/EInbV5DfGHOiMmvb1Xr-hp1r3JsPcQLi8jytr04NNhU.woff) format('woff');
+}
+
+@font-face {
+ font-family: "Open Sans";
+ font-style: normal;
+ font-weight: 400;
+ src: local("Open Sans"), local("OpenSans"), url(http://themes.googleusercontent.com/static/fonts/opensans/v6/K88pR3goAWT7BTt32Z01mz8E0i7KZn-EPnyo3HZu7kw.woff) format('woff');
+}
+
+body {
+ overflow-y: scroll!important;
+}
+
+h1 {
+ font-family: 'Segoe UI Light', 'Open Sans', Arial, Helvetica, sans-serif;
+ font-weight: 200;
+ font-size: 32pt;
+}
+
+.toolsSidebar h1 {
+ font-size: 42pt;
+}
+
+.ui-loader h1 {
+ font-weight: bold;
+ font-family: Arial;
+}
+
+h2 {
+ font-family: 'Segoe UI Semiight', 'Open Sans', Arial, Helvetica, sans-serif;
+ font-weight: 400;
+ font-size: 22pt;
+}
+
+pre, textarea.pre {
+ display: block;
+ padding: 8.5px;
+ font-size: 12.025px;
+ line-height: 18px;
+ word-break: break-all;
+ word-wrap: break-word;
+ white-space: pre;
+ white-space: pre-wrap;
+ background-color: #f5f5f5;
+ border: 1px solid #ccc;
+ border: 1px solid rgba(0, 0, 0, 0.15);
+ -webkit-border-radius: 4px;
+ -moz-border-radius: 4px;
+ border-radius: 4px;
+ font-family: Menlo, Monaco, Consolas, "Courier New", monospace;
+ color: #000;
+}
+
+.type-interior h2 {
+ color: #1B58B8;
+}
+
+/*
+ Page / Base styles
+ */
+.page {
+ background: #f2f2f2;
+ background-attachment: fixed;
+}
+
+.libraryPage {
+ background: #1d1d1d url(images/bg.png) top left repeat-x;
+ background: #262626!important;
+ background-attachment: fixed!important;
+}
+
+ .libraryPage .interiorLink {
+ color: #2489ce;
+ font-weight: bold;
+ }
+
+/*
+ Header
+ */
+.header {
+ padding: 10px 0 10px 10px;
+}
+
+.imgLogoIcon {
+ height: 45px;
+}
+
+.imgLogoText {
+ height: 45px;
+ display: none;
+}
+
+
+.ui-popup-container {
+ z-index: 99999;
+}
+
+.headerButtons {
+ float: right;
+ position: absolute;
+ top: 10px;
+ right: 10px;
+}
+
+.header .imageLink {
+ display: inline-block;
+}
+
+.imageLink + .imageLink {
+ margin-left: 30px;
+}
+
+.header .imageLink img {
+ height: 32px;
+ vertical-align: middle;
+}
+
+.btnCurrentUser {
+ text-decoration: none;
+}
+
+.currentUsername {
+ margin-right: 7px;
+ font-size: 20px;
+ color: #000;
+ position: relative;
+ top: 4px;
+}
+
+.libraryPage .currentUsername {
+ color: #fff;
+}
+
+h1 .imageLink {
+ margin-left: 15px;
+}
+
+ h1 .imageLink img {
+ height: 32px;
+ }
+
+.imageLink:hover {
+ opacity: .5;
+}
+
+.type-home h1 {
+ margin-top: 1.25em;
+ margin-bottom: 10px;
+ padding-bottom: 5px;
+ font-weight: normal;
+ border-bottom: 1px solid #777;
+}
+
+.libraryPage .ui-content > h1:first-child {
+ margin-top: 0;
+}
+
+.pageTitle {
+ margin-top: 0;
+}
+
+.imageButton {
+ background: transparent;
+ border: 0;
+ padding: 0;
+ cursor: pointer;
+ cursor: hand;
+}
+
+ .imageButton:hover {
+ opacity: .5;
+ }
+
+ .imageButton[disabled], .imageButton[disabled]:hover {
+ opacity: .3!important;
+ cursor: default;
+ }
+
+/*
+ Forms
+ */
+form, .readOnlyContent {
+ max-width: 600px;
+}
+
+.fieldDescription {
+ font-size: 11px;
+ padding-left: 5px;
+}
+
+.ulForm {
+ margin-bottom: 20px!important;
+}
+
+ .ulForm li:not(.ui-li-divider) {
+ background: none;
+ border-top: none;
+ border-bottom: none;
+ }
+
+.popup .ulForm {
+ margin-bottom: 0!important;
+}
+
+.popup .ui-content {
+ padding: 20px;
+}
+
+.content-secondary {
+ z-index: 99996;
+ background: #262626;
+ border: 0;
+ margin-top: 40px;
+}
+
+ .content-secondary h1 {
+ margin: 0;
+ padding: 20px 0 20px 30px;
+ color: #fff;
+ }
+
+.sidebarLinks a {
+ display: block;
+ padding: 12px 15px 12px 30px;
+ text-decoration: none;
+ color: #fff!important;
+ text-shadow: none!important;
+ font-weight: normal!important;
+ font-size: 17px;
+}
+
+ .sidebarLinks a:hover {
+ background: #f2f2f2;
+ color: #000!important;
+ }
+
+ .sidebarLinks a.selectedSidebarLink {
+ background: #2572EB!important;
+ color: #fff!important;
+ }
+
+/* Tabs (e.g. advanced metadata page) */
+.localnav {
+ margin-bottom: 40px!important;
+}
+
+ .localnav + form {
+ margin-top: -10px;
+ }
+
+.page > .ui-content {
+ padding-bottom: 100px;
+}
+
+@media all and (min-width: 650px) {
+
+ .imgLogoIcon {
+ height: 60px;
+ }
+
+ .imgLogoText {
+ height: 60px;
+ display: inline;
+ }
+
+ .header {
+ padding-left: 30px;
+ padding-top: 20px;
+ padding-bottom: 15px;
+ }
+
+ .headerButtons {
+ top: 20px;
+ right: 30px;
+ }
+
+ .localnav .ui-btn-inner {
+ font-size: 16px;
+ }
+
+ .libraryPage .ui-content {
+ padding-right: 50px;
+ padding-left: 50px;
+ }
+
+ .type-interior > .ui-content {
+ padding-right: 0;
+ padding-left: 0;
+ padding-top: 0;
+ overflow: hidden;
+ }
+
+ .content-secondary {
+ text-align: left;
+ width: 45%;
+ position: fixed;
+ top: 0;
+ left: 0;
+ bottom: 0;
+ margin: 0;
+ }
+
+ .content-primary {
+ width: 45%;
+ float: right;
+ padding: 0 6% 3em 0;
+ margin: 0;
+ }
+
+ .content-primary ul:first-child {
+ margin-top: 0;
+ }
+}
+
+@media all and (min-width: 750px) {
+
+ .content-secondary {
+ width: 34%;
+ }
+
+ .content-primary {
+ width: 56%;
+ }
+}
+
+@media all and (min-width: 1200px) {
+
+
+ .content-secondary {
+ width: 30%;
+ }
+
+ .content-primary {
+ width: 60%;
+ }
+}
+
+@media all and (min-width: 1440px) {
+
+
+ .content-secondary {
+ width: 25%;
+ }
+
+ .content-primary {
+ width: 65%;
+ }
+}
+
+@media all and (min-width: 1920px) {
+
+
+ .content-secondary {
+ width: 20%;
+ }
+
+ .content-primary {
+ width: 70%;
+ }
+}
+
+/*
+ Media Library Page
+ */
+.mediaFolderButtons {
+ margin-top: 10px;
+}
+
+.mediaFolderLocations {
+ margin: 1em .25em!important;
+}
+
+.mediaLocationsHeader {
+ padding-top: .75em!important;
+ padding-bottom: .75em!important;
+}
+
+ .mediaLocationsHeader .ui-btn {
+ position: absolute;
+ right: 3px;
+ margin-top: 0!important;
+ margin-bottom: 0!important;
+ top: 6px;
+ }
+
+#divVirtualFolders .ui-btn-inner, .mediaLocationsHeader, #divVirtualFolders .ui-btn-text {
+ font-size: 14px;
+}
+
+#ulDirectoryPickerList a {
+ padding-top: .4em;
+ padding-bottom: .4em;
+ font-size: 15px;
+}
+
+/*
+ Plugin updates Page
+ */
+#pluginUpdatesForm table {
+ width: 100%;
+}
+
+#pluginUpdatesForm td + td {
+ text-align: center;
+}
+
+
+/*
+ List Vew Items
+ */
+
+.posterViewItem {
+ display: inline-block;
+ margin: 5px;
+ text-align: center;
+ font-size: 15px;
+ padding: 0;
+ position: relative;
+}
+
+ .posterViewItem a {
+ color: white!important;
+ font-weight: normal!important;
+ text-decoration: none;
+ }
+
+ .posterViewItem img {
+ max-width: 155px;
+ max-height: 155px;
+ vertical-align: bottom;
+ }
+
+.premiumBanner img {
+ position: absolute;
+ text-align: right;
+ top: 0;
+ right: 0;
+ width: 75px!important;
+ height: 75px!important;
+ max-width: 75px!important;
+ max-height: 75px!important;
+}
+
+.posterViewItemText {
+ text-overflow: ellipsis;
+ overflow: hidden;
+ white-space: nowrap;
+ margin: 0;
+ padding: 4px 0px 0;
+ bottom: 0;
+ left: 0;
+ right: 0;
+ background: #181818;
+ text-shadow: none;
+ max-width: 155px;
+}
+
+ .posterViewItemText div{
+ text-overflow: ellipsis;
+ overflow: hidden;
+ white-space: nowrap;
+ margin: 0px 4px;
+ height: 24px;
+ }
+
+.posterViewItem:hover, .userItem:hover {
+ -moz-box-shadow: 0 0 20px 3px #2572EB;
+ -webkit-box-shadow: 0 0 20px 3px #2572EB;
+ box-shadow: 0 0 20px 3px #2572EB;
+}
+
+@media all and (min-width: 750px) {
+
+ .posterViewItem {
+ font-size: 16px;
+ }
+
+ .posterViewItemText {
+ padding-top: 5px;
+ max-width: 190px;
+ }
+
+ .posterViewItem img {
+ max-width: 190px;
+ max-height: 190px;
+ }
+}
+
+@media all and (min-width: 1200px) {
+
+ .posterViewItem {
+ font-size: 17px;
+ }
+
+ .posterViewItem img {
+ max-width: 280px;
+ max-height: 280px;
+ }
+
+ .posterViewItemText {
+ max-width: 280px;
+ }
+}
+
+@media all and (min-width: 1920px) {
+
+ .posterViewItem {
+ font-size: 19px;
+ }
+
+ .posterViewItemText div{
+ height: 28px;
+ }
+
+ .posterViewItem img {
+ max-width: 352px;
+ max-height: 352px;
+ }
+
+ .posterViewItemText {
+ max-width: 352px;
+ }
+}
+
+/* Startup wizard */
+.wizardPage {
+ background: #e2e2e2;
+}
+
+.wizardContent {
+ max-width: 800px;
+ padding: .5em 2em 1em;
+ margin: 0 auto;
+ background: #f2f2f2;
+}
+
+.wizardNavigation {
+ text-align: right;
+}
+
+.wizardContent form {
+ max-width: 100%;
+}
+
+.wizardContent p {
+ margin: 2em 0;
+}
+
+.wizardContent h2 img {
+ height: 35px;
+ vertical-align: middle;
+ margin-right: .5em;
+ position: relative;
+ top: -3px;
+}
+
+/* User Image */
+.imageDropZone {
+ border: 2px dashed #bbb;
+ -moz-border-radius: 5px;
+ -webkit-border-radius: 5px;
+ border-radius: 5px;
+ padding: 25px;
+ text-align: center;
+ color: #bbb;
+}
+
+/* Dashboard home */
+.tblConnections td {
+ padding: .5em 0 .5em 1.25em;
+}
+
+ .tblConnections td:first-child {
+ padding-left: 0;
+ }
+
+.tblConnections img {
+ height: 50px;
+}
+
+.clientNowPlayingImage {
+ border-radius: 5px;
+ border: 2px solid #ccc;
+}
+
+/* Footer */
+#footer {
+ background: #5a5a5a;
+ position: fixed;
+ bottom: -2px;
+ left: -2px;
+ right: -2px;
+ z-index: 99997;
+}
+
+.footerNotification {
+ text-shadow: none;
+ padding: .5em 1em;
+ margin: 0;
+ font-weight: normal;
+ border-top: 1px solid #999;
+}
+
+.notificationIcon {
+ height: 24px;
+ margin-right: 1em;
+ vertical-align: middle;
+}
+
+/*
+ * Gradient Shadow
+ */
+
+/* All HTML5 progress enabled browsers */
+progress {
+ /* Turns off styling - not usually needed, but good to know. */
+ appearance: none;
+ -moz-appearance: none;
+ -webkit-appearance: none;
+ /* gets rid of default border in Firefox and Opera. */
+ border: solid #cccccc 2px;
+ border-radius: 4px;
+ margin: 0;
+}
+
+ /* Polyfill */
+ progress[role]:after {
+ background-image: none; /* removes default background from polyfill */
+ }
+
+/*
+ * Background of the progress bar background
+ */
+
+/* Firefox and Polyfill */
+progress {
+ background: #cccccc !important; /* !important only needed in polyfill */
+}
+
+ /* Chrome */
+ progress::-webkit-progress-bar {
+ background: #cccccc;
+ }
+
+ /*
+ * Background of the progress bar value
+ */
+
+ /* Firefox */
+ progress::-moz-progress-bar {
+ border-radius: 5px;
+ background-image: -moz-linear-gradient( center bottom, rgb(43,194,83) 37%, rgb(84,240,84) 69% );
+ }
+
+ /* Chrome */
+ progress::-webkit-progress-value {
+ border-radius: 5px;
+ background-image: -webkit-gradient( linear, left bottom, left top, color-stop(0, rgb(43,194,83)), color-stop(1, rgb(84,240,84)) );
+ background-image: -webkit-linear-gradient( center bottom, rgb(43,194,83) 37%, rgb(84,240,84) 69% );
+ }
+
+ /* Polyfill */
+ progress[aria-valuenow]:before {
+ border-radius: 5px;
+ background-image: -moz-linear-gradient( center bottom, rgb(43,194,83) 37%, rgb(84,240,84) 69% );
+ background-image: -ms-linear-gradient( center bottom, rgb(43,194,83) 37%, rgb(84,240,84) 69% );
+ background-image: -o-linear-gradient( center bottom, rgb(43,194,83) 37%, rgb(84,240,84) 69% );
+ }
+
+/* Detail Page*/
+
+.itemDetailImage {
+ max-width: 100%;
+ max-height: 400px;
+}
+
+.itemImageBlock {
+ vertical-align: top;
+}
+
+.itemDetailBlock {
+ vertical-align: top;
+ padding-top: 1em;
+}
+
+ .itemDetailBlock p {
+ margin-top: 0;
+ }
+
+.starRating {
+ background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMYAAAA6CAYAAADryyY/AAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAOwgAADsIBFShKgAAAABp0RVh0U29mdHdhcmUAUGFpbnQuTkVUIHYzLjUuMTAw9HKhAAAS+klEQVR4Xu1de1gUV54dMJmdyWRcZzWZPNZMRLIRgxhFRhOdRCRKwMQkoGZ0hCCiGOOqSdSwrpmMiE58JDOT6LpmvnE0Jk40RoOPaHjKU1QQEBB5qPgCROhmdP377vnRVVDdXe/qruqgfN/5qrpuFV333HN+t+6jbv+IMfaju7jLwV0NOGugyxRW/rVdSe2H7/fn4GfVvdzlwcG81TzU19f7hB6sJsLP1pK2qvXSqjSUyU+BewBLzGGxILp4OHfu3B3Pw/nz532CB0uNcbl+ZUBnaxqzt6zunB0XNgSm+DnQx4paw0pj8DxAFJ0zZsy4Y3morKwMuHDhAvMFHqw0hp+tedWOztZURqgue/dzGOLfuZrD9FrDQmN080CiKCwsvGN5aGxs3EEc+AIPlhnj8rmU0M6WVawLzX/owptJY6JgjAeAe81+pLLKGEIeECkpWrKEhIQ7joeKiopQ3hS+wINVxvC3Xf19XmfzBzAEh2sfsOqTSw7DEIHA/Vxj3LSnKouM4cQDCQJRk+Xn599xPDQ0NOTxhvAFHqwwht+1+vciOq/9nnXh6vtO2PrJq0lww0PAj01zhTW9MW48QByMx8aNG+8YHs6cORNBAYEg5ID2reLBCmP426+sbOq8uhKGcMfF6nfLoNMnuYY4deOa8mdBjeHGg1AUpaWldwwP6KJtcjUE/9kqHsw2hl9Lw/I5nVf+mzljBT73YOdnMcvghoFcrWFKQ9xkY4jyAIEwITZt2tTreaiqqprjagpf4MFUYxRnJvW3X0pp6rz8X0wcKTiewlrrl7bAFMFAX7O6b800hhQProLAI0av5uHQoUP96+rqmlzz7Qs8mGkMvxuNy1I7L0H8l96TwXKkLWfpu15fBVM8AvyLGT1UJhpDkgeIhLli+/btvZaH6urqVLE8+wIPphnjVM6c/vamZZ2dTRB+N5Zh3wGk9eDiMtbe+O7NyIjBYTBFPzNqDbOMIccDRr6ZELW1tQziuTl+/Phex8ORI0f6I6+drnkW+2wFD2YZw6+98Z2/2C8uZe54F8c4XMBWgJKMhK3coN9PvF1rmGQMWR5IAISzZ8864eDBg72OBxj+L3x+pbZW8mCKMS6ULwhwCP4dcZzH8S687YQb9YtvvfD842Ngil8ANI/Ka39mGEOJB1ch8J/R1rg1bty4XsPD8ePHA6TyKnfcTB7MMIZ/R8Pi9B7RL4H4lbAY5zhQXZh4CG4YDHh10M8EYyjyUFNTw6SQnZ3da3hAbZHOG0Auz2JpZvHgbWP4XateEMGL3H27iNkbpfCfSHNgXnzIZBjjl97svvWyMVTxoCSSmTNn/uB5wLhEhFI+ldLN4MHbxvDvqF+YxwvcadsA0XdjIfalcbE0iQa7/sObg35eNoYqHhBJqbEtiaKioh88Dxi3yBMTvlLehelm8OANY9CAHMH/amVyrLPg32L2eiksQJoE6haw//lwwjyu+5Ya4jQizn+PR9odXjCGZh4gGiYHPGOztLS0HywPJ0+ejHU1gFKexdLN4EGvMboLnRMpvUNxT/Wx+MBLpUkvNFfOS2qtSk7rOPfmpW6xQ9z2bryJfSXMxzk9uFKWWF+eOePTs/mz3qrNj4ssTJ9K00ZojINm4lLDnO5B+CagphFzncbwKA9U4EpAw7X+8OHDn2ZlZb0FRO7du9dnecjIyAgsLi5+4dSpU0l4hErD+xaXeKEr5VMp3ds8yBlDWOgkuj7Ze2MHXDmdFHG1PCm2rTo5Ffi0o3Z+nu3c/CZxoTuL234On7uRjH0VqJ3H7DJor046c6NqTn5L+ezNzeWz0y4Ux01vLJo1EfdLNQtNRCTjdN2/S03jZBwZY5jGA4TD9OL06dNnysrK8k+cOLEZSMvLy5uem5vrVR527do1oKSkJALfF4vvTwU+xfTxPOShSUnYrul68+16nad4EBqDou29tYXxYfXFb0y6VpG0tLkiaU372eT8GzXzCoTRW7PAFcRtr50L8cvgbBKzy2IO0sVxvSKhsK0yoeDyyVl/bCr53XsVGVOjThyMeQZ5/RlnHjKOv8AYlvGgJA6IjukFHmMKEbkL8CLUHzGt/T1Mx4jat2+fIg85OTlhx44dmwTxL8X/WFNeXp4P8RVICV8pD55I18sBXaeWhy5jtFXNHYHobVeM4EYErihuEr+0wO1nE5Eughoc68Zs7MshAek9aKuIr9rxp/DhZBBf4MFIgUOwTC8glqoNGzZ084CaZwQEbPeEiKX+h5G8yl2rlwO6TsgDX2P0qcicEdVRM/efjscW70RvSXGT4A0I3F4NsXfjDewroCqe3aiIu/XB2yNnwhSPA325GsNSHqjAjRQsIjnTCojh1qJFi9x4+O6776JwL/9UMocvClwrB3S+Kw+8Mejx4f6t68ZPbq9KvOl4bPF29KbI7hzB9QjcDpFLIw5p7jhfOL1p/qwhi5Dn0cCvKO+cMSzlgTeFnoKVuwY1ABMDHpOasPiCJA9r1qyZjOtu6hW/EZPTtVbywBuDGpj0rD3gxfEDw66VxtXpfTzRLG6K7rLiJuGLC9xxfJYyzvyO2TmcL5jWFBTYLw55HQ88AdB0k3s5Y1jKg5IQpASu5ziZYvDgwYo8PPfcc2HoWarTK3KlPOlJ15NfueAgxoOw8U2ioO7P/pMjHgu9VDKzVOvjiZ7o3SN6bQLnhS67rZzJ7AIUfxOdNzSw3yzk8XmAujn7cQHBT9D4towHTxa48H+hq5QJsXv37jyIQTUP4eHhoWiwl+oRsdQ13sqr3P/VwoNrdy2JgsYEaF7SwPq86fvdxW4welOEF0RwVfsuAheKXWzfVjmDdaMC+8DxfdG5yFM0QFO46fHJaQ0rl+5aS3hQEotrwSp9Ri8Uc8WePXt084Bxk/2uQle6Z2+kK+XbNV0PD1LjGNTnT92Zj5YdfmWT6OOKVnHT+R4QOIm8B7/FvgTKX2c2Dp+tHbMJeXkRGAnQ2lVkfKeF3STGMUzlQarAxQpW7TE0Kqlh2YXVq1cb5uHbb7/d5Cmxe0Lg3uJBboCPRHEf8MjRzyet7I7sGsVNZhCL4HoEzgvdfTsdJnBH68mptz9bM5rEQANd1B35MJcnt9UOZQb4TONBrpCFAte6j7lFt1NTUz3Gw7Zt21by5tAqbjpfrZjFztOad+H5WnhQmhJCvTS0puyjf1s/dvaN07+92SVyp6jNf5aJ3hTVBRFcq8B7RD+N2U5LYSrSenD9RMzt2VMDaDGBSQC9P/4glxfRlUcUpoSYwoOWQseAG1MDEkNMTNfiEh7lYe3atbPx/Tf1ilxLXuXOVcMBnaOVByVjgM+u+Udkjl9uWBEac6Ns+k15kYtHb+eIrl7gQrH37MfCBBzKsHVBY85LTYnTApZyNcUwbAcA1LEguRyPirlSXudBbSGLnYepGcwV33//fVNsbKzXeFi+fHkMvvOmJ0RuJO/Caz3Fgxpj8OaguUcPvDMnaMLV4pg6W7mcuCnNOYLrEbitLAail8JrSONQii2HxuzJTUGD+8bjXicAT9E9AzRnSnZSoQpjeJ0HKmCxgtVzjEwREBDgdR6wnOgEzMuqI3N4Sty+wINaY5Ao+D7+vlOjHhvWfPy1WofYBdGb9kUiuB6B80K3lb4K0UvhFaT1oHjPhNynnuj7Ou6V5gANAv4VULUOrkpjeJUHPQagazDT1AmY3JcbGBhoGg+RkZHD0J1bq7Ym05tPpes8yYMWY/Ci4Ltzf3X2aHR6j+jFI7gegQvF3rM/BSbgcApbFxTvDnfthqQ1qVT/3oYGY3iNB9eC1fP5yy+/tIwHTExMVxKvmnQ9+Xa9xigPWo1BoqA/6qmhLs/HKw9O2tkT0Z0juB6B2069DNFL4ORLzCaCLzeG7cC9vAS4dseqfidDozG8woNaQWAkmolh3bp1lvOwf//+nbz41eZH73ne5EGvMYTmeKyl+KVm1wiuXeCTIXoxRDPbCTFE4XgUa8yIaMLNvArQvCdaoI26mDX/+IxOY3iUB6mC5o+jZ4V6V0SBSX8+wwPaHM1axK6Ub9d0M3gwYowuUaQuChroHMX1CZxE7o4XcYxDCbaiiKQfEaTBO5riQYOSmk1BGTFgDI/xIFfgfBrep6AflxGFL/CwcOHCgWqFria/Uud4mwejgvCrOxIxyRHRxYTNH1MncFtJJMQvhUlIE8faJU++DVHQEju6l/M0aAyP8CBX2GrSMH3cch6wONwkLYJXky+t53iCB6PG8G/Jn5jmHMnlxE1p0gK3lUxEOofj2HbjBey7IgLHHNj5YcgGmCKIe4xS3a7gGwoeqDE8woOYAAoKCphaYJq45Txg1m6aViGrOV8tB3SeJ3gwaow+bUUTD7iLXUzgYuKmYz0C79ov5jEB+1IIRxqHonBWsCNsP8RNUz5oYqCu39QwWGN4hAexwkc3KP3CkipgqoblPKB9cUBO6FoELjxXLQd0nid4MGqMe9qLIiod0dy4wG0QuTvG45gcnmd1B589A0PQrFl6t8KKNoZHeNBS+K7nQpAME/ws5wH3USknfiN5VHOtp3gwaowfO6K6cwTXK3Bb4fNMHM/huDxgiLEAjXLrWuPWYI3hER6o4KlgjcBqHtSIV805Rjiga43yYMQYfo3fjZ3oHs2lxE3HlQVuK/wNzpPDOGYrcMfSNwYmgoxHAV2/3WfAGB7jQasYsHoHc0VcXJxlPKDhPVGsJtOaL63ne4MHQ8a4lj12qbTY9QncIfqx4sjH8W48yzrye7Bl5RPvwxQ0DYQmPGpugBsxhqd4ECtgsWNYL4pJYcWKFZbxgAXWlmoVtfB8tfnnz/MmD0aM4X89d+xOW6F4BFcncGdxC4Xekf8MhM8hD1tJjEHaGJaxJZh+OH6I3ga4AWN4jAe5gqY09PgoYvPmzZbxgDf8dpLQPSlwMU7M4MGIMfq05T6b74jg+gVetH34seOfP51D4pbFMaRLYjSr/za0guuZ0tUAN2AMj/GAnxVDmcuLH8vgMzlgETXLeIAx8pXMLUwXyyt6lI75Ag9GjHGvexRXEDeJH+JuzRp9u3j78Nzocb9Ihpgjgd/MePGBaeX/ePpIx7HROEcOv0a6O65njfo/rmdKVwPcgDE8ygNmqk7DBLgjSgaQSsd0c8t4UDK1WDrlA/d8G4bIHTt2bLcerOZBtzEa0kNHiUdwaVG3ZoXdPvDnoD1DA+6jBb7odVOa30SPP/TTxY/RfuIrD7584vOQ3RD6rY7cMCaOUTjujlnRA2L0NsD1GsNbPEyZMuVlRM7dEM0tKRMgQjMxREVFmc4DJg+O0mpmMsTHH3+8Z9CgQZJ6sIoHvcbwu5YRNkcscjsfcwi7NXPU7fQ/DeENEcFFdvq9C3oHm6aH00tQBNp/CHji2eE/D8/ZOvTv1zNH3urICWXSGMnacxxYt2ggLR6mqwGu0xhe5yEkJCR8y5YtfyeDSBmBP56ZmckImK9kOg/4sck5ao1Bhvjoo494Q6jSg9k86DbG9czQTxzRXDx6d+SMYpcPj2j73xWDNkOsr3E1xCgSPUC/jkSj1NS1SgNywhXF6RilkUGGPBNy/4ScrUO2XTkyvLU9ZwQMIIHsp1nWlie34xqaTKj5Z8n0GsMsHoYNGzYBBtmGdx5aeQOIbdEzxNAAN50HiP0TMoacedGd25aSkmJID2bxoNcY/m1ZI/Pco7gjcl8+/HTbX1cO+gQCpXWcxgH03jU9KlHDmLpTlV4g4td1oink/8ZdG7x/Y+Cqq0dCWtqzh7NuZGGfw5mvhhbhXJoaorkBrtMYlvCwfv36VTBIC5lADHiDz3QecB95YqYg85Ih0I3scT14kwe9xrjnRvaITtfoXb0nuGbDkoEfQpg0DZxGoml1Dmo/8IbgawccUvXHG4TMRP+D/lfwvvWDUy+mBze0Z4YwIa4cCm5FOk0N0dwA12kMS3nAi0mpeLZvQLSmBmw3Dhw4YDoPMEanaw321Vdf1WCmq9f14A0edBmjYldQYDseXRwYzqr3PFWTkvAQDSzxNcRQF0Mo1RBKLuENQu0QMgjVPsEfv/3ogvpvgsrbM4NhEAd+PfQ+WiaGXljSNAKuxxi+wsPixYsXfP311+VCcwQFBZnGwxdffBEorLnIEPHx8abrwZM86DGG3+WDw2Lp8aVsZ9DR95MeThGpIfrhGInYqCFcDUMGoVrHqQb58zuPzG/Y++Tp9owg9tHihxdwxqHvVz0CrsMYPsfDkiVL5mMJztNHjx5liNSm8ZCenh5LxtixY8fRxMREy/XgCR50GaPhm6ETV89/hFbiCOUeXYQ1BAlS6yOTUo0hZhAyHX0XmZDmSAUlTO43JXXeg7Q6Bj1yaZoaoscYvspDdHT0lLlz55rGA2qricnJyT6nByM86DIG95hCjWJaB5Z6j2iZGm/UEEqG4WsQ+m66B3qEonvqD2h6m0+PMe7y0FU8VAb02Nqr9KDHGEQGvQxEZFBUFna5KgnZW+m8QcgM1JNFW03vZegwxl0eekqz1+nh/wHpt113GQ6n7AAAAABJRU5ErkJggg==);
+ background-position: left center;
+ background-repeat: no-repeat;
+ width: 24px;
+ height: 20px;
+ display: inline-block;
+ background-size: cover;
+}
+
+.galleryImage {
+ width: 120px;
+ display: inline-block;
+ margin: 5px;
+}
+
+.halfStarRating {
+ background-position: center center;
+}
+
+.emptyStarRating {
+ background-position: right center;
+}
+
+@media all and (min-width: 650px) {
+ .itemImageBlock {
+ display: inline-block;
+ }
+
+ .itemDetailImage, .itemImageBlock {
+ max-width: 220px;
+ }
+
+ .itemDetailBlock {
+ padding-top: 0;
+ display: inline-block;
+ width: 45%;
+ padding-left: 20px;
+ max-width: 800px;
+ }
+
+ .galleryImage {
+ width: 150px;
+ }
+}
+
+@media all and (min-width: 750px) {
+
+ .itemDetailImage, .itemImageBlock {
+ max-width: 300px;
+ }
+
+ .itemDetailBlock {
+ padding-left: 30px;
+ }
+}
+
+
+@media all and (min-width: 1200px) {
+
+ .itemDetailImage, .itemImageBlock {
+ max-width: 400px;
+ }
+
+ .itemDetailBlock {
+ width: 55%;
+ }
+
+ .galleryImage {
+ width: 200px;
+ }
+}
+
+/* Now playing bar */
+#nowPlayingBar {
+ padding: 10px 20px 8px;
+ border-top: 1px solid #5490CC;
+}
+
+.mediaButton {
+ margin: 0 20px 0 0;
+ display: inline-block;
+}
+
+#mediaElement {
+ margin-right: 20px;
+ display: inline-block;
+ position: relative;
+}
+
+.mediaButton img {
+ height: 28px;
+}
+
+.itemVideo {
+ position: absolute;
+ z-index: 99998;
+ height: auto;
+ width: 180px;
+ bottom: -5px;
+}
+
+@media all and (min-width: 650px) {
+
+ .itemVideo {
+ width: 270px;
+ }
+}
diff --git a/MediaBrowser.WebDashboard/Html/login.html b/MediaBrowser.WebDashboard/Html/login.html
index 4cb73c06e..36c453d55 100644
--- a/MediaBrowser.WebDashboard/Html/login.html
+++ b/MediaBrowser.WebDashboard/Html/login.html
@@ -7,7 +7,7 @@
<div id="loginPage" data-role="page" class="page standalonePage">
<div data-role="content">
- <div id="divUsers" style="margin: 50px 20px 20px; text-align: center;"></div>
+ <div id="divUsers" style="margin: 50px 0px 20px; text-align: center;"></div>
</div>
<div data-role="popup" id="popupLogin" class="ui-corner-all popup">
diff --git a/MediaBrowser.WebDashboard/Html/scripts/LoginPage.js b/MediaBrowser.WebDashboard/Html/scripts/LoginPage.js
index 46e7d53cc..ca4677e04 100644
--- a/MediaBrowser.WebDashboard/Html/scripts/LoginPage.js
+++ b/MediaBrowser.WebDashboard/Html/scripts/LoginPage.js
@@ -62,10 +62,12 @@
var background = Dashboard.getRandomMetroColor();
+ html += '<div class="posterViewItem">';
+
if (user.HasPassword) {
- html += "<a id='" + linkId + "' data-userid='" + user.Id + "' data-username='" + user.Name + "' href='#popupLogin' data-rel='popup' onclick='LoginPage.authenticatingLinkId=this.id;' class='userItem'>";
+ html += "<a id='" + linkId + "' data-userid='" + user.Id + "' data-username='" + user.Name + "' href='#popupLogin' data-rel='popup' onclick='LoginPage.authenticatingLinkId=this.id;' \">";
} else {
- html += "<a id='" + linkId + "' data-userid='" + user.Id + "' data-username='" + user.Name + "' href='#' onclick='LoginPage.authenticateUserLink(this);' class='userItem'>";
+ html += "<a id='" + linkId + "' data-userid='" + user.Id + "' data-username='" + user.Name + "' href='#' onclick='LoginPage.authenticateUserLink(this);' \">";
}
if (user.PrimaryImageTag) {
@@ -76,20 +78,28 @@
type: "Primary"
});
- html += '<img class="userItemImage" src="' + imgUrl + '" />';
+ html += '<img src="' + imgUrl + '" />';
} else {
- html += '<img class="userItemImage" src="css/images/logindefault.png" style="background:' + background + ';" />';
+ html += '<img style="background:' + background + ';" src="css/images/logindefault.png"/>';
}
- html += '<div class="userItemContent" style="background:' + background + ';">';
+ html += '<div class="posterViewItemText">';
- html += '<div class="userItemContentInner">';
- html += '<p class="userItemHeader">' + user.Name + '</p>';
- html += '<p>' + LoginPage.getLastSeenText(user.LastActivityDate) + '</p>';
+ html += '<div>' + user.Name + '</div>';
+ html += '<div>';
+ var lastSeen = LoginPage.getLastSeenText(user.LastActivityDate);
+ if (lastSeen != "") {
+ html += lastSeen;
+ }
+ else {
+ html += "&nbsp;";
+ }
html += '</div>';
html += '</div>';
html += '</a>';
+
+ html += '</div>';
}
$('#divUsers', '#loginPage').html(html);
diff --git a/MediaBrowser.WebDashboard/Html/scripts/PluginCatalogPage.js b/MediaBrowser.WebDashboard/Html/scripts/PluginCatalogPage.js
index 51034a033..5b6dc982e 100644
--- a/MediaBrowser.WebDashboard/Html/scripts/PluginCatalogPage.js
+++ b/MediaBrowser.WebDashboard/Html/scripts/PluginCatalogPage.js
@@ -49,21 +49,23 @@
if (plugin.isPremium) {
html += "<div class='premiumBanner'><img src='css/images/premiumflag.png' /></div>";
}
-
+
var color = plugin.tileColor || Dashboard.getRandomMetroColor();
-
+
html += "<div class='posterViewItemText' style='background:" + color + "'>";
var installedPlugin = installedPlugins.filter(function (ip) {
return ip.Name == plugin.name;
})[0];
+ html += "<div>";
if (installedPlugin) {
html += plugin.name + " (Installed)";
} else {
html += plugin.name;
}
+ html += "</div>";
html += "</div>";
diff --git a/MediaBrowser.WebDashboard/Html/scripts/site.js b/MediaBrowser.WebDashboard/Html/scripts/site.js
index d358b974e..d5479b3ed 100644
--- a/MediaBrowser.WebDashboard/Html/scripts/site.js
+++ b/MediaBrowser.WebDashboard/Html/scripts/site.js
@@ -1,1185 +1,1187 @@
-$.ajaxSetup({
- crossDomain: true,
-
- error: function (event, jqxhr, settings, exception) {
- Dashboard.hideLoadingMsg();
-
- if (!Dashboard.suppressAjaxErrors) {
- setTimeout(function () {
-
-
- var msg = event.getResponseHeader("X-Application-Error-Code") || Dashboard.defaultErrorMessage;
-
- Dashboard.showError(msg);
- }, 500);
- }
- }
-});
-
-$.support.cors = true;
-
-$(document).one('click', WebNotifications.requestPermission);
-
-var Dashboard = {
- jQueryMobileInit: function () {
-
- //$.mobile.defaultPageTransition = 'slide';
-
- // Page
- //$.mobile.page.prototype.options.theme = "a";
- //$.mobile.page.prototype.options.headerTheme = "a";
- //$.mobile.page.prototype.options.contentTheme = "a";
- //$.mobile.page.prototype.options.footerTheme = "a";
-
- //$.mobile.button.prototype.options.theme = "c";
- $.mobile.listview.prototype.options.dividerTheme = "b";
-
- $.mobile.popup.prototype.options.theme = "c";
- //$.mobile.collapsible.prototype.options.contentTheme = "a";
- },
-
- getCurrentUser: function () {
-
- if (!Dashboard.getUserPromise) {
- Dashboard.getUserPromise = ApiClient.getUser(Dashboard.getCurrentUserId()).fail(Dashboard.logout);
- }
-
- return Dashboard.getUserPromise;
- },
-
- validateCurrentUser: function () {
- Dashboard.getUserPromise = null;
-
- if (Dashboard.getCurrentUserId()) {
- Dashboard.getCurrentUser();
- }
-
- // Re-render the header
- $('.header').remove();
- Dashboard.ensureHeader($.mobile.activePage);
- },
-
- getCurrentUserId: function () {
-
- var userId = localStorage.getItem("userId");
-
- if (!userId) {
- var autoLoginUserId = getParameterByName('u');
-
- if (autoLoginUserId) {
- userId = autoLoginUserId;
- localStorage.setItem("userId", userId);
- }
- }
-
- return userId;
- },
-
- setCurrentUser: function (userId) {
- localStorage.setItem("userId", userId);
- Dashboard.getUserPromise = null;
- },
-
- logout: function () {
- localStorage.removeItem("userId");
- Dashboard.getUserPromise = null;
- window.location = "login.html";
- },
-
- showError: function (message) {
-
- $.mobile.loading('show', {
- theme: "e",
- text: message,
- textonly: true,
- textVisible: true
- });
-
- setTimeout(function () {
- $.mobile.loading('hide');
- }, 2000);
- },
-
- alert: function (message) {
-
- $.mobile.loading('show', {
- theme: "e",
- text: message,
- textonly: true,
- textVisible: true
- });
-
- setTimeout(function () {
- $.mobile.loading('hide');
- }, 2000);
- },
-
- updateSystemInfo: function (info) {
-
- var isFirstLoad = !Dashboard.lastSystemInfo;
-
- Dashboard.lastSystemInfo = info;
- Dashboard.ensureWebSocket(info);
-
- if (!Dashboard.initialServerVersion) {
- Dashboard.initialServerVersion = info.Version;
- }
-
- if (info.HasPendingRestart) {
-
- Dashboard.hideDashboardVersionWarning();
- Dashboard.showServerRestartWarning();
-
- } else {
-
- Dashboard.hideServerRestartWarning();
-
- if (Dashboard.initialServerVersion != info.Version) {
-
- Dashboard.showDashboardVersionWarning();
- }
- }
-
- if (isFirstLoad) {
- Dashboard.showFailedAssemblies(info.FailedPluginAssemblies);
- }
-
- Dashboard.showInProgressInstallations(info.InProgressInstallations);
- },
-
- showFailedAssemblies: function (failedAssemblies) {
-
- for (var i = 0, length = failedAssemblies.length; i < length; i++) {
-
- var assembly = failedAssemblies[i];
-
- var html = '<img src="css/images/notifications/error.png" class="notificationIcon" />';
-
- var index = assembly.lastIndexOf('\\');
-
- if (index != -1) {
- assembly = assembly.substring(index + 1);
- }
-
- html += '<span>';
- html += assembly + " failed to load.";
- html += '</span>';
-
- Dashboard.showFooterNotification({ html: html });
-
- }
- },
-
- showInProgressInstallations: function (installations) {
-
- installations = installations || [];
-
- for (var i = 0, length = installations.length; i < length; i++) {
-
- var installation = installations[i];
-
- var percent = installation.PercentComplete || 0;
-
- if (percent < 100) {
- Dashboard.showPackageInstallNotification(installation, "progress");
- }
- }
-
- if (installations.length) {
-
- Dashboard.ensureInstallRefreshInterval();
- } else {
- Dashboard.stopInstallRefreshInterval();
- }
- },
-
- ensureInstallRefreshInterval: function () {
-
- if (!Dashboard.installRefreshInterval) {
-
- if (Dashboard.isWebSocketOpen()) {
- Dashboard.sendWebSocketMessage("SystemInfoStart", "0,350");
- }
- Dashboard.installRefreshInterval = 1;
- }
- },
-
- stopInstallRefreshInterval: function () {
-
- if (Dashboard.installRefreshInterval) {
- if (Dashboard.isWebSocketOpen()) {
- Dashboard.sendWebSocketMessage("SystemInfoStop");
- }
- Dashboard.installRefreshInterval = null;
- }
- },
-
- cancelInstallation: function (id) {
-
- ApiClient.cancelPackageInstallation(id).always(Dashboard.refreshSystemInfoFromServer);
-
- },
-
- showServerRestartWarning: function () {
-
- var html = '<span style="margin-right: 1em;">Please restart Media Browser Server to finish updating.</span>';
- html += '<button type="button" data-icon="refresh" onclick="Dashboard.restartServer();" data-theme="b" data-inline="true" data-mini="true">Restart Server</button>';
-
- Dashboard.showFooterNotification({ id: "serverRestartWarning", html: html, forceShow: true, allowHide: false });
- },
-
- hideServerRestartWarning: function () {
-
- $('#serverRestartWarning').remove();
- },
-
- showDashboardVersionWarning: function () {
-
- var html = '<span style="margin-right: 1em;">Please refresh this page to receive new updates from the server.</span>';
- html += '<button type="button" data-icon="refresh" onclick="Dashboard.reloadPage();" data-theme="b" data-inline="true" data-mini="true">Refresh Page</button>';
-
- Dashboard.showFooterNotification({ id: "dashboardVersionWarning", html: html, forceShow: true, allowHide: false });
- },
-
- reloadPage: function () {
-
- window.location.href = window.location.href;
- },
-
- hideDashboardVersionWarning: function () {
-
- $('#dashboardVersionWarning').remove();
- },
-
- showFooterNotification: function (options) {
-
- var removeOnHide = !options.id;
-
- options.id = options.id || "notification" + new Date().getTime() + parseInt(Math.random());
-
- var parentElem = $('#footerNotifications');
-
- var elem = $('#' + options.id, parentElem);
-
- if (!elem.length) {
- elem = $('<p id="' + options.id + '" class="footerNotification"></p>').appendTo(parentElem);
- }
-
- var onclick = removeOnHide ? "$(\"#" + options.id + "\").remove();" : "$(\"#" + options.id + "\").hide();";
-
- if (options.allowHide !== false) {
- options.html += "<span style='margin-left: 1em;'><button type='button' onclick='" + onclick + "' data-icon='delete' data-iconpos='notext' data-mini='true' data-inline='true' data-theme='a'>Hide</button></span>";
- }
-
- if (options.forceShow) {
- elem.show();
- }
-
- elem.html(options.html).trigger('create');
-
- if (options.timeout) {
-
- setTimeout(function () {
-
- if (removeOnHide) {
- elem.remove();
- } else {
- elem.hide();
- }
-
- }, options.timeout);
- }
- },
-
- getConfigurationPageUrl: function (name) {
- return "ConfigurationPage?name=" + encodeURIComponent(name);
- },
-
- navigate: function (url, preserveQueryString) {
-
- var queryString = window.location.search;
- if (preserveQueryString && queryString) {
- url += queryString;
- }
- $.mobile.changePage(url);
- },
-
- showLoadingMsg: function () {
- $.mobile.showPageLoadingMsg();
- },
-
- hideLoadingMsg: function () {
- $.mobile.hidePageLoadingMsg();
- },
-
- processPluginConfigurationUpdateResult: function () {
-
- Dashboard.hideLoadingMsg();
-
- Dashboard.alert("Settings saved.");
- },
-
- defaultErrorMessage: "There was an error processing the request.",
-
- processServerConfigurationUpdateResult: function (result) {
-
- Dashboard.hideLoadingMsg();
-
- Dashboard.alert("Settings saved.");
- },
-
- confirm: function (message, title, callback) {
-
- $('#confirmFlyout').popup("close").remove();
-
- var html = '<div data-role="popup" id="confirmFlyout" style="max-width:500px;" class="ui-corner-all">';
-
- html += '<div class="ui-corner-top ui-bar-a" style="text-align:center;">';
- html += '<h3>' + title + '</h3>';
- html += '</div>';
-
- html += '<div data-role="content" class="ui-corner-bottom ui-content">';
-
- html += '<div style="padding: 1em .25em;margin: 0;">';
- html += message;
- html += '</div>';
-
- html += '<p><button type="button" data-icon="ok" onclick="$(\'#confirmFlyout\')[0].confirm=true;$(\'#confirmFlyout\').popup(\'close\');" data-theme="b">Ok</button></p>';
- html += '<p><button type="button" data-icon="delete" onclick="$(\'#confirmFlyout\').popup(\'close\');" data-theme="a">Cancel</button></p>';
- html += '</div>';
-
- html += '</div>';
-
- $(document.body).append(html);
-
- $('#confirmFlyout').popup().trigger('create').popup("open").on("popupafterclose", function () {
-
- if (callback) {
- callback(this.confirm == true);
- }
-
- $(this).off("popupafterclose").remove();
- });
- },
-
- refreshSystemInfoFromServer: function () {
- ApiClient.getSystemInfo().done(function (info) {
-
- Dashboard.updateSystemInfo(info);
- });
- },
-
- restartServer: function () {
-
- Dashboard.suppressAjaxErrors = true;
- Dashboard.showLoadingMsg();
-
- ApiClient.performPendingRestart().done(function () {
-
- setTimeout(function () {
- Dashboard.reloadPageWhenServerAvailable();
- }, 500);
-
- }).fail(function () {
- Dashboard.suppressAjaxErrors = false;
- });
- },
-
- reloadPageWhenServerAvailable: function (retryCount) {
-
- ApiClient.getSystemInfo().done(function () {
- Dashboard.reloadPage();
-
- }).fail(function () {
- setTimeout(function () {
-
- retryCount = retryCount || 0;
- retryCount++;
-
- if (retryCount < 10) {
- Dashboard.reloadPageWhenServerAvailable(retryCount);
- } else {
- Dashboard.suppressAjaxErrors = false;
- }
- }, 500);
- });
- },
-
- getPosterViewHtml: function (options) {
-
- var html = "";
-
- for (var i = 0, length = options.items.length; i < length; i++) {
- var item = options.items[i];
-
- var hasPrimaryImage = item.ImageTags && item.ImageTags.Primary;
-
- var href = item.IsFolder ? "#" : "itemDetails.html?id=" + item.Id;
-
- html += "<div class='posterViewItem'><a href='" + href + "'>";
-
- if (options.preferBackdrop && item.BackdropImageTags && item.BackdropImageTags.length) {
- html += "<img src='" + ApiClient.getImageUrl(item.Id, {
- type: "Backdrop",
- height: 198,
- width: 352,
- tag: item.BackdropImageTags[0]
- }) + "' />";
- } else if (hasPrimaryImage) {
- html += "<img src='" + ApiClient.getImageUrl(item.Id, {
- type: "Primary",
- height: 300,
- tag: item.ImageTags.Primary
- }) + "' />";
- }
- else if (item.BackdropImageTags && item.BackdropImageTags.length) {
- html += "<img src='" + ApiClient.getImageUrl(item.Id, {
- type: "Backdrop",
- height: 198,
- width: 352,
- tag: item.BackdropImageTags[0]
- }) + "' />";
- } else {
- html += "<img style='background:" + Dashboard.getRandomMetroColor() + ";' src='css/images/defaultCollectionImage.png' />";
- }
-
- if (options.showTitle || !hasPrimaryImage || (item.Type !== 'Movie' && item.Type !== 'Series' && item.Type !== 'Season')) {
- html += "<div class='posterViewItemText'>" + item.Name + "</div>";
- }
-
- html += "</a></div>";
- }
-
- return html;
- },
-
- showUserFlyout: function () {
-
- Dashboard.getCurrentUser().done(function (user) {
-
- var html = '<div data-role="popup" id="userFlyout" style="max-width:400px;margin-top:50px;margin-right:20px;" class="ui-corner-all" data-position-to=".btnCurrentUser:visible">';
-
- html += '<a href="#" data-rel="back" data-role="button" data-theme="a" data-icon="delete" data-iconpos="notext" class="ui-btn-right">Close</a>';
-
- html += '<div class="ui-corner-top ui-bar-a" style="text-align:center;">';
- html += '<h3>' + user.Name + '</h3>';
- html += '</div>';
-
- html += '<div data-role="content" class="ui-corner-bottom ui-content">';
-
- html += '<p style="text-align:center;">';
-
- var imageUrl = user.PrimaryImageTag ? ApiClient.getUserImageUrl(user.Id, {
-
- height: 400,
- tag: user.PrimaryImageTag,
- type: "Primary"
-
- }) : "css/images/userFlyoutDefault.png";
-
- html += '<img style="max-height:125px;max-width:200px;" src="' + imageUrl + '" />';
- html += '</p>';
-
- html += '<p><button type="button" onclick="Dashboard.navigate(\'editUser.html?userId=' + user.Id + '\');" data-icon="user">View Profile</button></p>';
- html += '<p><button type="button" onclick="Dashboard.logout();" data-icon="lock">Sign Out</button></p>';
- html += '</div>';
-
- html += '</div>';
-
- $(document.body).append(html);
-
- $('#userFlyout').popup().trigger('create').popup("open").on("popupafterclose", function () {
-
- $(this).off("popupafterclose").remove();
- });
- });
- },
-
- selectDirectory: function (options) {
-
- options = options || {};
-
- options.header = options.header || "Select Media Path";
-
- var html = '<div data-role="popup" id="popupDirectoryPicker" class="ui-corner-all popup">';
-
- html += '<div class="ui-corner-top ui-bar-a" style="text-align: center; padding: 0 20px;">';
- html += '<h3>' + options.header + '</h3>';
- html += '</div>';
-
- html += '<div data-role="content" class="ui-corner-bottom ui-content">';
- html += '<form>';
- html += '<p>Browse to or enter the folder containing the media. Network paths (UNC) are recommended for optimal playback performance.</p>';
-
- html += '<div data-role="fieldcontain" style="margin:0;">';
- html += '<label for="txtDirectoryPickerPath">Current Folder:</label>';
- html += '<input id="txtDirectoryPickerPath" name="txtDirectoryPickerPath" type="text" onchange="Dashboard.refreshDirectoryBrowser(this.value);" required="required" style="font-weight:bold;" />';
- html += '</div>';
-
- html += '<div style="height: 300px; overflow-y: auto;">';
- html += '<ul id="ulDirectoryPickerList" data-role="listview" data-inset="true" data-auto-enhanced="false"></ul>';
- html += '</div>';
-
- html += '<p>';
- html += '<button type="submit" data-theme="b" data-icon="ok">OK</button>';
- html += '<button type="button" data-icon="delete" onclick="$(this).parents(\'.popup\').popup(\'close\');">Cancel</button>';
- html += '</p>';
- html += '</form>';
- html += '</div>';
- html += '</div>';
-
- $($.mobile.activePage).append(html);
-
- var popup = $('#popupDirectoryPicker').popup().trigger('create').popup("open").on("popupafterclose", function () {
-
- $('form', this).off("submit");
- $(this).off("click").off("popupafterclose").remove();
-
- }).on("click", ".lnkDirectory", function () {
-
- var path = this.getAttribute('data-path');
-
- Dashboard.refreshDirectoryBrowser(path);
- });
-
- var txtCurrentPath = $('#txtDirectoryPickerPath', popup);
-
- if (options.path) {
- txtCurrentPath.val(options.path);
- }
-
- $('form', popup).on('submit', function () {
-
- if (options.callback) {
- options.callback($('#txtDirectoryPickerPath', this).val());
- }
-
- return false;
- });
-
- Dashboard.refreshDirectoryBrowser(txtCurrentPath.val());
- },
-
- refreshDirectoryBrowser: function (path) {
- var page = $.mobile.activePage;
-
- Dashboard.showLoadingMsg();
-
- var promise;
-
- if (path === "Network") {
- promise = ApiClient.getNetworkComputers();
- }
- else if (path) {
- promise = ApiClient.getDirectoryContents(path, { includeDirectories: true });
- } else {
- promise = ApiClient.getDrives();
- }
-
- promise.done(function (folders) {
-
- $('#txtDirectoryPickerPath', page).val(path || "");
-
- var html = '';
-
- if (path) {
-
- var parentPath = path;
-
- if (parentPath.endsWith('\\')) {
- parentPath = parentPath.substring(0, parentPath.length - 1);
- }
-
- var lastIndex = parentPath.lastIndexOf('\\');
- parentPath = lastIndex == -1 ? "" : parentPath.substring(0, lastIndex);
-
- if (parentPath.endsWith(':')) {
- parentPath += "\\";
- }
-
- if (parentPath == '\\') {
- parentPath = "Network";
- }
-
- html += '<li><a class="lnkDirectory" data-path="' + parentPath + '" href="#">..</a></li>';
- }
-
- for (var i = 0, length = folders.length; i < length; i++) {
-
- var folder = folders[i];
-
- html += '<li><a class="lnkDirectory" data-path="' + folder.Path + '" href="#">' + folder.Name + '</a></li>';
- }
-
- if (!path) {
- html += '<li><a class="lnkDirectory" data-path="Network" href="#">Network</a></li>';
- }
-
- $('#ulDirectoryPickerList', page).html(html).listview('refresh');
-
- Dashboard.hideLoadingMsg();
-
- }).fail(function () {
-
- $('#txtDirectoryPickerPath', page).val("");
- $('#ulDirectoryPickerList', page).html('').listview('refresh');
-
- Dashboard.hideLoadingMsg();
- });
- },
-
- getPluginSecurityInfo: function () {
-
- if (!Dashboard.getPluginSecurityInfoPromise) {
- Dashboard.getPluginSecurityInfoPromise = ApiClient.getPluginSecurityInfo();
- }
-
- return Dashboard.getPluginSecurityInfoPromise;
- },
-
- resetPluginSecurityInfo: function () {
- Dashboard.getPluginSecurityInfoPromise = null;
- },
-
- ensureHeader: function (page) {
-
- if (!$('.header', page).length) {
-
- var isLoggedIn = Dashboard.getCurrentUserId();
-
- if (isLoggedIn) {
-
- var promise1 = Dashboard.getCurrentUser();
- var promise2 = Dashboard.getPluginSecurityInfo();
-
- $.when(promise1, promise2).done(function (response1, response2) {
-
- Dashboard.renderHeader(page, response1[0], response2[0]);
- });
-
- } else {
-
- Dashboard.renderHeader(page);
- }
- }
- },
-
- renderHeader: function (page, user, pluginSecurityInfo) {
-
- var headerHtml = '';
- headerHtml += '<div class="header">';
-
- var isLibraryPage = page.hasClass('libraryPage');
-
- headerHtml += '<a class="logo" href="index.html">';
-
- if (page.hasClass('standalonePage')) {
-
- headerHtml += '<img class="imgLogo" src="css/images/mblogoblackfull.png" />';
- }
- else if (isLibraryPage) {
-
- headerHtml += '<img class="imgLogo" src="css/images/mblogowhitefull.png" />';
- }
- headerHtml += '</a>';
-
- var imageColor = isLibraryPage ? "White" : "Black";
-
- if (user && !page.hasClass('wizardPage')) {
- headerHtml += '<div class="headerButtons">';
- headerHtml += '<a class="imageLink btnCurrentUser" href="#" onclick="Dashboard.showUserFlyout();"><span class="currentUsername">' + user.Name + '</span>';
-
- if (user.PrimaryImageTag) {
-
- var url = ApiClient.getUserImageUrl(user.Id, {
- width: 225,
- tag: user.PrimaryImageTag,
- type: "Primary"
- });
-
- headerHtml += '<img src="' + url + '" />';
- } else {
- headerHtml += '<img src="css/images/currentUserDefault' + imageColor + '.png" />';
- }
- headerHtml += '</a>';
-
- if (pluginSecurityInfo.IsMBSupporter) {
- headerHtml += '<a class="imageLink" href="supporter.html"><img src="css/images/suppbadge.png" /></a>';
- }
- if (user.Configuration.IsAdministrator) {
- headerHtml += '<a class="imageLink" href="dashboard.html"><img src="css/images/tools' + imageColor + '.png" /></a>';
- }
-
- headerHtml += '</div>';
- }
-
- headerHtml += '</div>';
- page.prepend(headerHtml);
- },
-
- ensureToolsMenu: function (page) {
-
- if (!page.hasClass('type-interior')) {
- return;
- }
-
- var sidebar = $('.toolsSidebar', page);
-
- if (!sidebar.length) {
-
- var html = '<div class="content-secondary ui-bar-a toolsSidebar">';
-
- html += '<h1><a href="index.html" class="imageLink" style="margin-left: 0;margin-right: 20px;"> <img src="css/images/home.png" /></a>Tools</h1>';
-
- html += '<div class="sidebarLinks">';
-
- var links = Dashboard.getToolsMenuLinks(page);
-
- for (var i = 0, length = links.length; i < length; i++) {
-
- var link = links[i];
-
- if (link.href) {
-
- if (link.selected) {
- html += '<a class="selectedSidebarLink" href="' + link.href + '">' + link.name + '</a>';
- } else {
- html += '<a href="' + link.href + '">' + link.name + '</a>';
- }
-
- }
- }
-
- // collapsible
- html += '</div>';
-
- // content-secondary
- html += '</div>';
-
- $(page).append(html);
- }
- },
-
- getToolsMenuLinks: function (page) {
-
- var pageElem = page[0];
-
- return [{
- name: "Dashboard",
- href: "dashboard.html",
- selected: pageElem.id == "dashboardPage"
- }, {
- name: "Media Library",
- href: "library.html",
- selected: pageElem.id == "mediaLibraryPage"
- }, {
- name: "Metadata",
- href: "metadata.html",
- selected: pageElem.id == "metadataConfigurationPage" || pageElem.id == "advancedMetadataConfigurationPage" || pageElem.id == "metadataImagesConfigurationPage"
- }, {
- name: "Plugins",
- href: "plugins.html",
- selected: page.hasClass("pluginConfigurationPage")
- }, {
- name: "User Profiles",
- href: "userProfiles.html",
- selected: page.hasClass("userProfilesConfigurationPage")
- }, {
- name: "Display Settings",
- href: "uiSettings.html",
- selected: pageElem.id == "displaySettingsPage"
- }, {
- name: "Advanced",
- href: "advanced.html",
- selected: pageElem.id == "advancedConfigurationPage"
- }, {
- name: "Scheduled Tasks",
- href: "scheduledTasks.html",
- selected: pageElem.id == "scheduledTasksPage" || pageElem.id == "scheduledTaskPage"
- }, {
- name: "Help",
- href: "support.html",
- selected: pageElem.id == "supportPage" || pageElem.id == "logPage" || pageElem.id == "supporterPage" || pageElem.id == "supporterKeyPage"
- }];
-
- },
-
- ensureWebSocket: function (systemInfo) {
-
- if (!("WebSocket" in window)) {
- // Not supported by the browser
- return;
- }
-
- if (Dashboard.webSocket) {
- if (Dashboard.webSocket.readyState === WebSocket.OPEN || Dashboard.webSocket.readyState === WebSocket.CONNECTING) {
- return;
- }
- }
-
- systemInfo = systemInfo || Dashboard.lastSystemInfo;
-
- var url = "ws://" + ApiClient.serverHostName + ":" + systemInfo.WebSocketPortNumber + "/mediabrowser";
-
- var ws = new WebSocket(url);
-
- ws.onmessage = Dashboard.onWebSocketMessage;
-
- ws.onopen = function () {
- setTimeout(function () {
- $(document).trigger("websocketopen");
- }, 500);
- };
- ws.onerror = function () {
- setTimeout(function () {
- $(document).trigger("websocketerror");
- }, 0);
- };
- ws.onclose = function () {
- setTimeout(function () {
- $(document).trigger("websocketclose");
- }, 0);
- };
-
- Dashboard.webSocket = ws;
- },
-
- resetWebSocketPingInterval: function () {
-
- if (Dashboard.pingWebSocketInterval) {
- clearInterval(Dashboard.pingWebSocketInterval);
- Dashboard.pingWebSocketInterval = null;
- }
- Dashboard.pingWebSocketInterval = setInterval(Dashboard.pingWebSocket, 30000);
- },
-
- pingWebSocket: function () {
-
- // Send a ping to the server every so often to try and keep the connection alive
- if (Dashboard.isWebSocketOpen()) {
- Dashboard.sendWebSocketMessage("ping");
- }
-
- },
-
- onWebSocketMessage: function (msg) {
-
- msg = JSON.parse(msg.data);
-
- if (msg.MessageType === "LibraryChanged") {
- Dashboard.processLibraryUpdateNotification(msg.Data);
- }
- else if (msg.MessageType === "UserDeleted") {
- Dashboard.validateCurrentUser();
- }
- else if (msg.MessageType === "SystemInfo") {
- Dashboard.updateSystemInfo(msg.Data);
- }
- else if (msg.MessageType === "HasPendingRestartChanged") {
- Dashboard.updateSystemInfo(msg.Data);
- }
- else if (msg.MessageType === "UserUpdated") {
- Dashboard.validateCurrentUser();
-
- var user = msg.Data;
-
- if (user.Id == Dashboard.getCurrentUserId()) {
-
- $('.currentUsername').html(user.Name);
- }
- }
- else if (msg.MessageType === "PackageInstallationCompleted") {
- Dashboard.showPackageInstallNotification(msg.Data, "completed");
- Dashboard.refreshSystemInfoFromServer();
- }
- else if (msg.MessageType === "PackageInstallationFailed") {
- Dashboard.showPackageInstallNotification(msg.Data, "failed");
- Dashboard.refreshSystemInfoFromServer();
- }
- else if (msg.MessageType === "PackageInstallationCancelled") {
- Dashboard.showPackageInstallNotification(msg.Data, "cancelled");
- Dashboard.refreshSystemInfoFromServer();
- }
- else if (msg.MessageType === "PackageInstalling") {
- Dashboard.showPackageInstallNotification(msg.Data, "progress");
- Dashboard.refreshSystemInfoFromServer();
- }
- else if (msg.MessageType === "ScheduledTaskEndExecute") {
-
- Dashboard.showTaskCompletionNotification(msg.Data);
- }
-
- $(document).trigger("websocketmessage", [msg]);
- },
-
- sendWebSocketMessage: function (name, data) {
-
- var msg = { MessageType: name };
-
- if (data) {
- msg.Data = data;
- }
-
- msg = JSON.stringify(msg);
-
- Dashboard.webSocket.send(msg);
- },
-
- isWebSocketOpen: function () {
- return Dashboard.webSocket && Dashboard.webSocket.readyState === WebSocket.OPEN;
- },
-
- showTaskCompletionNotification: function (result) {
-
- var html = '';
-
- if (result.Status == "Completed") {
- html += '<img src="css/images/notifications/done.png" class="notificationIcon" />';
- return;
- }
- else if (result.Status == "Cancelled") {
- html += '<img src="css/images/notifications/info.png" class="notificationIcon" />';
- return;
- }
- else {
- html += '<img src="css/images/notifications/error.png" class="notificationIcon" />';
- }
-
- html += '<span>';
- html += result.Name + " " + result.Status;
- html += '</span>';
-
- var timeout = 0;
-
- if (result.Status == 'Cancelled') {
- timeout = 2000;
- }
-
- Dashboard.showFooterNotification({ html: html, id: result.Id, forceShow: true, timeout: timeout });
- },
-
- showPackageInstallNotification: function (installation, status) {
-
- var html = '';
-
- if (status == 'completed') {
- html += '<img src="css/images/notifications/done.png" class="notificationIcon" />';
- }
- else if (status == 'cancelled') {
- html += '<img src="css/images/notifications/info.png" class="notificationIcon" />';
- }
- else if (status == 'failed') {
- html += '<img src="css/images/notifications/error.png" class="notificationIcon" />';
- }
- else if (status == 'progress') {
- html += '<img src="css/images/notifications/download.png" class="notificationIcon" />';
- }
-
- html += '<span style="margin-right: 1em;">';
-
- if (status == 'completed') {
- html += installation.Name + ' ' + installation.Version + ' installation completed';
- }
- else if (status == 'cancelled') {
- html += installation.Name + ' ' + installation.Version + ' installation was cancelled';
- }
- else if (status == 'failed') {
- html += installation.Name + ' ' + installation.Version + ' installation failed';
- }
- else if (status == 'progress') {
- html += 'Installing ' + installation.Name + ' ' + installation.Version;
- }
-
- html += '</span>';
-
- if (status == 'progress') {
-
- var percentComplete = Math.round(installation.PercentComplete || 0);
-
- html += '<progress style="margin-right: 1em;" max="100" value="' + percentComplete + '" title="' + percentComplete + '%">';
- html += '' + percentComplete + '%';
- html += '</progress>';
-
- if (percentComplete < 100) {
- var btnId = "btnCancel" + installation.Id;
- html += '<button id="' + btnId + '" type="button" data-icon="delete" onclick="$(\'' + btnId + '\').button(\'disable\');Dashboard.cancelInstallation(\'' + installation.Id + '\');" data-theme="b" data-inline="true" data-mini="true">Cancel</button>';
- }
- }
-
- var timeout = 0;
-
- if (status == 'cancelled') {
- timeout = 2000;
- }
-
- var forceShow = status != "progress";
- var allowHide = status != "progress" && status != 'cancelled';
-
- Dashboard.showFooterNotification({ html: html, id: installation.Id, timeout: timeout, forceShow: forceShow, allowHide: allowHide });
- },
-
- processLibraryUpdateNotification: function (data) {
-
- var newItems = data.ItemsAdded.filter(function (a) {
- return !a.IsFolder;
- });
-
- if (!Dashboard.newItems) {
- Dashboard.newItems = [];
- }
-
- for (var i = 0, length = newItems.length ; i < length; i++) {
-
- Dashboard.newItems.push(newItems[i]);
- }
-
- if (Dashboard.newItemTimeout) {
- clearTimeout(Dashboard.newItemTimeout);
- }
-
- Dashboard.newItemTimeout = setTimeout(Dashboard.onNewItemTimerStopped, 60000);
- },
-
- onNewItemTimerStopped: function () {
-
- var newItems = Dashboard.newItems;
-
- newItems = newItems.sort(function (a, b) {
-
- if (a.PrimaryImageTag && b.PrimaryImageTag) {
- return 0;
- }
-
- if (a.PrimaryImageTag) {
- return -1;
- }
-
- return 1;
- });
-
- Dashboard.newItems = [];
- Dashboard.newItemTimeout = null;
-
- // Show at most 3 notifications
- for (var i = 0, length = Math.min(newItems.length, 3) ; i < length; i++) {
-
- var item = newItems[i];
-
- var data = {
- title: "New " + item.Type,
- body: item.Name,
- timeout: 6000
- };
-
- if (item.PrimaryImageTag) {
- data.icon = ApiClient.getImageUrl(item.Id, {
- width: 100,
- tag: item.PrimaryImageTag
- });
- }
-
- WebNotifications.show(data);
- }
- },
-
- ensurePageTitle: function (page) {
-
- if (!page.hasClass('type-interior')) {
- return;
- }
-
- var pageElem = page[0];
-
- if (pageElem.hasPageTitle) {
- return;
- }
-
- var parent = $('.content-primary', page);
-
- if (!parent.length) {
- parent = $('.ui-content', page)[0];
- }
-
- $(parent).prepend("<h2 class='pageTitle'>" + (document.title || "&nbsp;") + "</h2>");
-
- pageElem.hasPageTitle = true;
- },
-
- setPageTitle: function (title) {
-
- $('.pageTitle', $.mobile.activePage).html(title);
-
- if (title) {
- document.title = title;
- }
- },
-
- metroColors: ["#6FBD45", "#4BB3DD", "#4164A5", "#E12026", "#800080", "#E1B222", "#008040", "#0094FF", "#FF00C7", "#FF870F", "#7F0037"],
-
- getRandomMetroColor: function () {
-
- var index = Math.floor(Math.random() * (Dashboard.metroColors.length - 1));
-
- return Dashboard.metroColors[index];
- }
-
-};
-
-$(function () {
-
- var footerHtml = '<div id="footer" class="ui-bar-a">';
-
- footerHtml += '<div id="nowPlayingBar" style="display:none;">';
-
- footerHtml += '<button id="previousTrackButton" class="imageButton mediaButton" title="Previous Track" type="button"><img src="css/images/media/previousTrack.png" /></button>';
-
- footerHtml += '<button id="stopButton" class="imageButton mediaButton" title="Stop" type="button" onclick="MediaPlayer.stop();"><img src="css/images/media/stop.png" /></button>';
-
- footerHtml += '<button id="nextTrackButton" class="imageButton mediaButton" title="Next Track" type="button"><img src="css/images/media/nextTrack.png" /></button>';
-
- footerHtml += '<div id="mediaElement"></div>';
-
- footerHtml += '</div>';
-
- footerHtml += '<div id="footerNotifications"></div>';
-
- footerHtml += '</div>';
-
-
- $(document.body).append(footerHtml);
-});
-
-Dashboard.jQueryMobileInit();
-
-$(document).on('pagebeforeshow', ".page", function () {
-
- Dashboard.refreshSystemInfoFromServer();
-
- var page = $(this);
-
- Dashboard.ensureHeader(page);
- Dashboard.ensurePageTitle(page);
-
-}).on('pageinit', ".page", function () {
-
- var page = $(this);
- var hasLogin = Dashboard.getCurrentUserId();
-
- if (!hasLogin) {
-
- if (this.id !== "loginPage" && !page.hasClass('wizardPage')) {
-
- Dashboard.logout();
- }
- }
-
- else {
-
- Dashboard.getCurrentUser().done(function (user) {
-
- if (user.Configuration.IsAdministrator) {
- Dashboard.ensureToolsMenu(page);
- }
- });
- }
+$.ajaxSetup({
+ crossDomain: true,
+
+ error: function (event, jqxhr, settings, exception) {
+ Dashboard.hideLoadingMsg();
+
+ if (!Dashboard.suppressAjaxErrors) {
+ setTimeout(function () {
+
+
+ var msg = event.getResponseHeader("X-Application-Error-Code") || Dashboard.defaultErrorMessage;
+
+ Dashboard.showError(msg);
+ }, 500);
+ }
+ }
+});
+
+$.support.cors = true;
+
+$(document).one('click', WebNotifications.requestPermission);
+
+var Dashboard = {
+ jQueryMobileInit: function () {
+
+ //$.mobile.defaultPageTransition = 'slide';
+
+ // Page
+ //$.mobile.page.prototype.options.theme = "a";
+ //$.mobile.page.prototype.options.headerTheme = "a";
+ //$.mobile.page.prototype.options.contentTheme = "a";
+ //$.mobile.page.prototype.options.footerTheme = "a";
+
+ //$.mobile.button.prototype.options.theme = "c";
+ $.mobile.listview.prototype.options.dividerTheme = "b";
+
+ $.mobile.popup.prototype.options.theme = "c";
+ //$.mobile.collapsible.prototype.options.contentTheme = "a";
+ },
+
+ getCurrentUser: function () {
+
+ if (!Dashboard.getUserPromise) {
+ Dashboard.getUserPromise = ApiClient.getUser(Dashboard.getCurrentUserId()).fail(Dashboard.logout);
+ }
+
+ return Dashboard.getUserPromise;
+ },
+
+ validateCurrentUser: function () {
+ Dashboard.getUserPromise = null;
+
+ if (Dashboard.getCurrentUserId()) {
+ Dashboard.getCurrentUser();
+ }
+
+ // Re-render the header
+ $('.header').remove();
+ Dashboard.ensureHeader($.mobile.activePage);
+ },
+
+ getCurrentUserId: function () {
+
+ var userId = localStorage.getItem("userId");
+
+ if (!userId) {
+ var autoLoginUserId = getParameterByName('u');
+
+ if (autoLoginUserId) {
+ userId = autoLoginUserId;
+ localStorage.setItem("userId", userId);
+ }
+ }
+
+ return userId;
+ },
+
+ setCurrentUser: function (userId) {
+ localStorage.setItem("userId", userId);
+ Dashboard.getUserPromise = null;
+ },
+
+ logout: function () {
+ localStorage.removeItem("userId");
+ Dashboard.getUserPromise = null;
+ window.location = "login.html";
+ },
+
+ showError: function (message) {
+
+ $.mobile.loading('show', {
+ theme: "e",
+ text: message,
+ textonly: true,
+ textVisible: true
+ });
+
+ setTimeout(function () {
+ $.mobile.loading('hide');
+ }, 2000);
+ },
+
+ alert: function (message) {
+
+ $.mobile.loading('show', {
+ theme: "e",
+ text: message,
+ textonly: true,
+ textVisible: true
+ });
+
+ setTimeout(function () {
+ $.mobile.loading('hide');
+ }, 2000);
+ },
+
+ updateSystemInfo: function (info) {
+
+ var isFirstLoad = !Dashboard.lastSystemInfo;
+
+ Dashboard.lastSystemInfo = info;
+ Dashboard.ensureWebSocket(info);
+
+ if (!Dashboard.initialServerVersion) {
+ Dashboard.initialServerVersion = info.Version;
+ }
+
+ if (info.HasPendingRestart) {
+
+ Dashboard.hideDashboardVersionWarning();
+ Dashboard.showServerRestartWarning();
+
+ } else {
+
+ Dashboard.hideServerRestartWarning();
+
+ if (Dashboard.initialServerVersion != info.Version) {
+
+ Dashboard.showDashboardVersionWarning();
+ }
+ }
+
+ if (isFirstLoad) {
+ Dashboard.showFailedAssemblies(info.FailedPluginAssemblies);
+ }
+
+ Dashboard.showInProgressInstallations(info.InProgressInstallations);
+ },
+
+ showFailedAssemblies: function (failedAssemblies) {
+
+ for (var i = 0, length = failedAssemblies.length; i < length; i++) {
+
+ var assembly = failedAssemblies[i];
+
+ var html = '<img src="css/images/notifications/error.png" class="notificationIcon" />';
+
+ var index = assembly.lastIndexOf('\\');
+
+ if (index != -1) {
+ assembly = assembly.substring(index + 1);
+ }
+
+ html += '<span>';
+ html += assembly + " failed to load.";
+ html += '</span>';
+
+ Dashboard.showFooterNotification({ html: html });
+
+ }
+ },
+
+ showInProgressInstallations: function (installations) {
+
+ installations = installations || [];
+
+ for (var i = 0, length = installations.length; i < length; i++) {
+
+ var installation = installations[i];
+
+ var percent = installation.PercentComplete || 0;
+
+ if (percent < 100) {
+ Dashboard.showPackageInstallNotification(installation, "progress");
+ }
+ }
+
+ if (installations.length) {
+
+ Dashboard.ensureInstallRefreshInterval();
+ } else {
+ Dashboard.stopInstallRefreshInterval();
+ }
+ },
+
+ ensureInstallRefreshInterval: function () {
+
+ if (!Dashboard.installRefreshInterval) {
+
+ if (Dashboard.isWebSocketOpen()) {
+ Dashboard.sendWebSocketMessage("SystemInfoStart", "0,350");
+ }
+ Dashboard.installRefreshInterval = 1;
+ }
+ },
+
+ stopInstallRefreshInterval: function () {
+
+ if (Dashboard.installRefreshInterval) {
+ if (Dashboard.isWebSocketOpen()) {
+ Dashboard.sendWebSocketMessage("SystemInfoStop");
+ }
+ Dashboard.installRefreshInterval = null;
+ }
+ },
+
+ cancelInstallation: function (id) {
+
+ ApiClient.cancelPackageInstallation(id).always(Dashboard.refreshSystemInfoFromServer);
+
+ },
+
+ showServerRestartWarning: function () {
+
+ var html = '<span style="margin-right: 1em;">Please restart Media Browser Server to finish updating.</span>';
+ html += '<button type="button" data-icon="refresh" onclick="Dashboard.restartServer();" data-theme="b" data-inline="true" data-mini="true">Restart Server</button>';
+
+ Dashboard.showFooterNotification({ id: "serverRestartWarning", html: html, forceShow: true, allowHide: false });
+ },
+
+ hideServerRestartWarning: function () {
+
+ $('#serverRestartWarning').remove();
+ },
+
+ showDashboardVersionWarning: function () {
+
+ var html = '<span style="margin-right: 1em;">Please refresh this page to receive new updates from the server.</span>';
+ html += '<button type="button" data-icon="refresh" onclick="Dashboard.reloadPage();" data-theme="b" data-inline="true" data-mini="true">Refresh Page</button>';
+
+ Dashboard.showFooterNotification({ id: "dashboardVersionWarning", html: html, forceShow: true, allowHide: false });
+ },
+
+ reloadPage: function () {
+
+ window.location.href = window.location.href;
+ },
+
+ hideDashboardVersionWarning: function () {
+
+ $('#dashboardVersionWarning').remove();
+ },
+
+ showFooterNotification: function (options) {
+
+ var removeOnHide = !options.id;
+
+ options.id = options.id || "notification" + new Date().getTime() + parseInt(Math.random());
+
+ var parentElem = $('#footerNotifications');
+
+ var elem = $('#' + options.id, parentElem);
+
+ if (!elem.length) {
+ elem = $('<p id="' + options.id + '" class="footerNotification"></p>').appendTo(parentElem);
+ }
+
+ var onclick = removeOnHide ? "$(\"#" + options.id + "\").remove();" : "$(\"#" + options.id + "\").hide();";
+
+ if (options.allowHide !== false) {
+ options.html += "<span style='margin-left: 1em;'><button type='button' onclick='" + onclick + "' data-icon='delete' data-iconpos='notext' data-mini='true' data-inline='true' data-theme='a'>Hide</button></span>";
+ }
+
+ if (options.forceShow) {
+ elem.show();
+ }
+
+ elem.html(options.html).trigger('create');
+
+ if (options.timeout) {
+
+ setTimeout(function () {
+
+ if (removeOnHide) {
+ elem.remove();
+ } else {
+ elem.hide();
+ }
+
+ }, options.timeout);
+ }
+ },
+
+ getConfigurationPageUrl: function (name) {
+ return "ConfigurationPage?name=" + encodeURIComponent(name);
+ },
+
+ navigate: function (url, preserveQueryString) {
+
+ var queryString = window.location.search;
+ if (preserveQueryString && queryString) {
+ url += queryString;
+ }
+ $.mobile.changePage(url);
+ },
+
+ showLoadingMsg: function () {
+ $.mobile.showPageLoadingMsg();
+ },
+
+ hideLoadingMsg: function () {
+ $.mobile.hidePageLoadingMsg();
+ },
+
+ processPluginConfigurationUpdateResult: function () {
+
+ Dashboard.hideLoadingMsg();
+
+ Dashboard.alert("Settings saved.");
+ },
+
+ defaultErrorMessage: "There was an error processing the request.",
+
+ processServerConfigurationUpdateResult: function (result) {
+
+ Dashboard.hideLoadingMsg();
+
+ Dashboard.alert("Settings saved.");
+ },
+
+ confirm: function (message, title, callback) {
+
+ $('#confirmFlyout').popup("close").remove();
+
+ var html = '<div data-role="popup" id="confirmFlyout" style="max-width:500px;" class="ui-corner-all">';
+
+ html += '<div class="ui-corner-top ui-bar-a" style="text-align:center;">';
+ html += '<h3>' + title + '</h3>';
+ html += '</div>';
+
+ html += '<div data-role="content" class="ui-corner-bottom ui-content">';
+
+ html += '<div style="padding: 1em .25em;margin: 0;">';
+ html += message;
+ html += '</div>';
+
+ html += '<p><button type="button" data-icon="ok" onclick="$(\'#confirmFlyout\')[0].confirm=true;$(\'#confirmFlyout\').popup(\'close\');" data-theme="b">Ok</button></p>';
+ html += '<p><button type="button" data-icon="delete" onclick="$(\'#confirmFlyout\').popup(\'close\');" data-theme="a">Cancel</button></p>';
+ html += '</div>';
+
+ html += '</div>';
+
+ $(document.body).append(html);
+
+ $('#confirmFlyout').popup().trigger('create').popup("open").on("popupafterclose", function () {
+
+ if (callback) {
+ callback(this.confirm == true);
+ }
+
+ $(this).off("popupafterclose").remove();
+ });
+ },
+
+ refreshSystemInfoFromServer: function () {
+ ApiClient.getSystemInfo().done(function (info) {
+
+ Dashboard.updateSystemInfo(info);
+ });
+ },
+
+ restartServer: function () {
+
+ Dashboard.suppressAjaxErrors = true;
+ Dashboard.showLoadingMsg();
+
+ ApiClient.performPendingRestart().done(function () {
+
+ setTimeout(function () {
+ Dashboard.reloadPageWhenServerAvailable();
+ }, 500);
+
+ }).fail(function () {
+ Dashboard.suppressAjaxErrors = false;
+ });
+ },
+
+ reloadPageWhenServerAvailable: function (retryCount) {
+
+ ApiClient.getSystemInfo().done(function () {
+ Dashboard.reloadPage();
+
+ }).fail(function () {
+ setTimeout(function () {
+
+ retryCount = retryCount || 0;
+ retryCount++;
+
+ if (retryCount < 10) {
+ Dashboard.reloadPageWhenServerAvailable(retryCount);
+ } else {
+ Dashboard.suppressAjaxErrors = false;
+ }
+ }, 500);
+ });
+ },
+
+ getPosterViewHtml: function (options) {
+
+ var html = "";
+
+ for (var i = 0, length = options.items.length; i < length; i++) {
+ var item = options.items[i];
+
+ var hasPrimaryImage = item.ImageTags && item.ImageTags.Primary;
+
+ var href = item.IsFolder ? "#" : "itemDetails.html?id=" + item.Id;
+
+ html += "<div class='posterViewItem'><a href='" + href + "'>";
+
+ if (options.preferBackdrop && item.BackdropImageTags && item.BackdropImageTags.length) {
+ html += "<img src='" + ApiClient.getImageUrl(item.Id, {
+ type: "Backdrop",
+ height: 198,
+ width: 352,
+ tag: item.BackdropImageTags[0]
+ }) + "' />";
+ } else if (hasPrimaryImage) {
+ html += "<img src='" + ApiClient.getImageUrl(item.Id, {
+ type: "Primary",
+ height: 300,
+ tag: item.ImageTags.Primary
+ }) + "' />";
+ }
+ else if (item.BackdropImageTags && item.BackdropImageTags.length) {
+ html += "<img src='" + ApiClient.getImageUrl(item.Id, {
+ type: "Backdrop",
+ height: 198,
+ width: 352,
+ tag: item.BackdropImageTags[0]
+ }) + "' />";
+ } else {
+ html += "<img style='background:" + Dashboard.getRandomMetroColor() + ";' src='css/images/defaultCollectionImage.png' />";
+ }
+
+ if (options.showTitle || !hasPrimaryImage || (item.Type !== 'Movie' && item.Type !== 'Series' && item.Type !== 'Season')) {
+ html += "<div class='posterViewItemText'>";
+ html += "<div>" + item.Name + "</div>";
+ html += "</div>"
+ }
+
+ html += "</a></div>";
+ }
+
+ return html;
+ },
+
+ showUserFlyout: function () {
+
+ Dashboard.getCurrentUser().done(function (user) {
+
+ var html = '<div data-role="popup" id="userFlyout" style="max-width:400px;margin-top:50px;margin-right:20px;" class="ui-corner-all" data-position-to=".btnCurrentUser:visible">';
+
+ html += '<a href="#" data-rel="back" data-role="button" data-theme="a" data-icon="delete" data-iconpos="notext" class="ui-btn-right">Close</a>';
+
+ html += '<div class="ui-corner-top ui-bar-a" style="text-align:center;">';
+ html += '<h3>' + user.Name + '</h3>';
+ html += '</div>';
+
+ html += '<div data-role="content" class="ui-corner-bottom ui-content">';
+
+ html += '<p style="text-align:center;">';
+
+ var imageUrl = user.PrimaryImageTag ? ApiClient.getUserImageUrl(user.Id, {
+
+ height: 400,
+ tag: user.PrimaryImageTag,
+ type: "Primary"
+
+ }) : "css/images/userFlyoutDefault.png";
+
+ html += '<img style="max-height:125px;max-width:200px;" src="' + imageUrl + '" />';
+ html += '</p>';
+
+ html += '<p><button type="button" onclick="Dashboard.navigate(\'editUser.html?userId=' + user.Id + '\');" data-icon="user">View Profile</button></p>';
+ html += '<p><button type="button" onclick="Dashboard.logout();" data-icon="lock">Sign Out</button></p>';
+ html += '</div>';
+
+ html += '</div>';
+
+ $(document.body).append(html);
+
+ $('#userFlyout').popup().trigger('create').popup("open").on("popupafterclose", function () {
+
+ $(this).off("popupafterclose").remove();
+ });
+ });
+ },
+
+ selectDirectory: function (options) {
+
+ options = options || {};
+
+ options.header = options.header || "Select Media Path";
+
+ var html = '<div data-role="popup" id="popupDirectoryPicker" class="ui-corner-all popup">';
+
+ html += '<div class="ui-corner-top ui-bar-a" style="text-align: center; padding: 0 20px;">';
+ html += '<h3>' + options.header + '</h3>';
+ html += '</div>';
+
+ html += '<div data-role="content" class="ui-corner-bottom ui-content">';
+ html += '<form>';
+ html += '<p>Browse to or enter the folder containing the media. Network paths (UNC) are recommended for optimal playback performance.</p>';
+
+ html += '<div data-role="fieldcontain" style="margin:0;">';
+ html += '<label for="txtDirectoryPickerPath">Current Folder:</label>';
+ html += '<input id="txtDirectoryPickerPath" name="txtDirectoryPickerPath" type="text" onchange="Dashboard.refreshDirectoryBrowser(this.value);" required="required" style="font-weight:bold;" />';
+ html += '</div>';
+
+ html += '<div style="height: 300px; overflow-y: auto;">';
+ html += '<ul id="ulDirectoryPickerList" data-role="listview" data-inset="true" data-auto-enhanced="false"></ul>';
+ html += '</div>';
+
+ html += '<p>';
+ html += '<button type="submit" data-theme="b" data-icon="ok">OK</button>';
+ html += '<button type="button" data-icon="delete" onclick="$(this).parents(\'.popup\').popup(\'close\');">Cancel</button>';
+ html += '</p>';
+ html += '</form>';
+ html += '</div>';
+ html += '</div>';
+
+ $($.mobile.activePage).append(html);
+
+ var popup = $('#popupDirectoryPicker').popup().trigger('create').popup("open").on("popupafterclose", function () {
+
+ $('form', this).off("submit");
+ $(this).off("click").off("popupafterclose").remove();
+
+ }).on("click", ".lnkDirectory", function () {
+
+ var path = this.getAttribute('data-path');
+
+ Dashboard.refreshDirectoryBrowser(path);
+ });
+
+ var txtCurrentPath = $('#txtDirectoryPickerPath', popup);
+
+ if (options.path) {
+ txtCurrentPath.val(options.path);
+ }
+
+ $('form', popup).on('submit', function () {
+
+ if (options.callback) {
+ options.callback($('#txtDirectoryPickerPath', this).val());
+ }
+
+ return false;
+ });
+
+ Dashboard.refreshDirectoryBrowser(txtCurrentPath.val());
+ },
+
+ refreshDirectoryBrowser: function (path) {
+ var page = $.mobile.activePage;
+
+ Dashboard.showLoadingMsg();
+
+ var promise;
+
+ if (path === "Network") {
+ promise = ApiClient.getNetworkComputers();
+ }
+ else if (path) {
+ promise = ApiClient.getDirectoryContents(path, { includeDirectories: true });
+ } else {
+ promise = ApiClient.getDrives();
+ }
+
+ promise.done(function (folders) {
+
+ $('#txtDirectoryPickerPath', page).val(path || "");
+
+ var html = '';
+
+ if (path) {
+
+ var parentPath = path;
+
+ if (parentPath.endsWith('\\')) {
+ parentPath = parentPath.substring(0, parentPath.length - 1);
+ }
+
+ var lastIndex = parentPath.lastIndexOf('\\');
+ parentPath = lastIndex == -1 ? "" : parentPath.substring(0, lastIndex);
+
+ if (parentPath.endsWith(':')) {
+ parentPath += "\\";
+ }
+
+ if (parentPath == '\\') {
+ parentPath = "Network";
+ }
+
+ html += '<li><a class="lnkDirectory" data-path="' + parentPath + '" href="#">..</a></li>';
+ }
+
+ for (var i = 0, length = folders.length; i < length; i++) {
+
+ var folder = folders[i];
+
+ html += '<li><a class="lnkDirectory" data-path="' + folder.Path + '" href="#">' + folder.Name + '</a></li>';
+ }
+
+ if (!path) {
+ html += '<li><a class="lnkDirectory" data-path="Network" href="#">Network</a></li>';
+ }
+
+ $('#ulDirectoryPickerList', page).html(html).listview('refresh');
+
+ Dashboard.hideLoadingMsg();
+
+ }).fail(function () {
+
+ $('#txtDirectoryPickerPath', page).val("");
+ $('#ulDirectoryPickerList', page).html('').listview('refresh');
+
+ Dashboard.hideLoadingMsg();
+ });
+ },
+
+ getPluginSecurityInfo: function () {
+
+ if (!Dashboard.getPluginSecurityInfoPromise) {
+ Dashboard.getPluginSecurityInfoPromise = ApiClient.getPluginSecurityInfo();
+ }
+
+ return Dashboard.getPluginSecurityInfoPromise;
+ },
+
+ resetPluginSecurityInfo: function () {
+ Dashboard.getPluginSecurityInfoPromise = null;
+ },
+
+ ensureHeader: function (page) {
+
+ if (!$('.header', page).length) {
+
+ var isLoggedIn = Dashboard.getCurrentUserId();
+
+ if (isLoggedIn) {
+
+ var promise1 = Dashboard.getCurrentUser();
+ var promise2 = Dashboard.getPluginSecurityInfo();
+
+ $.when(promise1, promise2).done(function (response1, response2) {
+
+ Dashboard.renderHeader(page, response1[0], response2[0]);
+ });
+
+ } else {
+
+ Dashboard.renderHeader(page);
+ }
+ }
+ },
+
+ renderHeader: function (page, user, pluginSecurityInfo) {
+
+ var headerHtml = '';
+ headerHtml += '<div class="header">';
+
+ var isLibraryPage = page.hasClass('libraryPage');
+
+ headerHtml += '<a class="logo" href="index.html">';
+
+ if (page.hasClass('standalonePage')) {
+
+ headerHtml += '<img class="imgLogoIcon" src="css/images/mblogoicon.png" /><img class="imgLogoText" src="css/images/mblogotextblack.png" />';
+ }
+ else if (isLibraryPage) {
+
+ headerHtml += '<img class="imgLogoIcon" src="css/images/mblogoicon.png" /><img class="imgLogoText" src="css/images/mblogotextwhite.png" />';
+ }
+ headerHtml += '</a>';
+
+ var imageColor = isLibraryPage ? "White" : "Black";
+
+ if (user && !page.hasClass('wizardPage')) {
+ headerHtml += '<div class="headerButtons">';
+ headerHtml += '<a class="imageLink btnCurrentUser" href="#" onclick="Dashboard.showUserFlyout();"><span class="currentUsername">' + user.Name + '</span>';
+
+ if (user.PrimaryImageTag) {
+
+ var url = ApiClient.getUserImageUrl(user.Id, {
+ width: 225,
+ tag: user.PrimaryImageTag,
+ type: "Primary"
+ });
+
+ headerHtml += '<img src="' + url + '" />';
+ } else {
+ headerHtml += '<img src="css/images/currentUserDefault' + imageColor + '.png" />';
+ }
+ headerHtml += '</a>';
+
+ if (pluginSecurityInfo.IsMBSupporter) {
+ headerHtml += '<a class="imageLink" href="supporter.html"><img src="css/images/suppbadge.png" /></a>';
+ }
+ if (user.Configuration.IsAdministrator) {
+ headerHtml += '<a class="imageLink" href="dashboard.html"><img src="css/images/tools' + imageColor + '.png" /></a>';
+ }
+
+ headerHtml += '</div>';
+ }
+
+ headerHtml += '</div>';
+ page.prepend(headerHtml);
+ },
+
+ ensureToolsMenu: function (page) {
+
+ if (!page.hasClass('type-interior')) {
+ return;
+ }
+
+ var sidebar = $('.toolsSidebar', page);
+
+ if (!sidebar.length) {
+
+ var html = '<div class="content-secondary ui-bar-a toolsSidebar">';
+
+ html += '<h1><a href="index.html" class="imageLink" style="margin-left: 0;margin-right: 20px;"> <img src="css/images/home.png" /></a>Tools</h1>';
+
+ html += '<div class="sidebarLinks">';
+
+ var links = Dashboard.getToolsMenuLinks(page);
+
+ for (var i = 0, length = links.length; i < length; i++) {
+
+ var link = links[i];
+
+ if (link.href) {
+
+ if (link.selected) {
+ html += '<a class="selectedSidebarLink" href="' + link.href + '">' + link.name + '</a>';
+ } else {
+ html += '<a href="' + link.href + '">' + link.name + '</a>';
+ }
+
+ }
+ }
+
+ // collapsible
+ html += '</div>';
+
+ // content-secondary
+ html += '</div>';
+
+ $(page).append(html);
+ }
+ },
+
+ getToolsMenuLinks: function (page) {
+
+ var pageElem = page[0];
+
+ return [{
+ name: "Dashboard",
+ href: "dashboard.html",
+ selected: pageElem.id == "dashboardPage"
+ }, {
+ name: "Media Library",
+ href: "library.html",
+ selected: pageElem.id == "mediaLibraryPage"
+ }, {
+ name: "Metadata",
+ href: "metadata.html",
+ selected: pageElem.id == "metadataConfigurationPage" || pageElem.id == "advancedMetadataConfigurationPage" || pageElem.id == "metadataImagesConfigurationPage"
+ }, {
+ name: "Plugins",
+ href: "plugins.html",
+ selected: page.hasClass("pluginConfigurationPage")
+ }, {
+ name: "User Profiles",
+ href: "userProfiles.html",
+ selected: page.hasClass("userProfilesConfigurationPage")
+ }, {
+ name: "Display Settings",
+ href: "uiSettings.html",
+ selected: pageElem.id == "displaySettingsPage"
+ }, {
+ name: "Advanced",
+ href: "advanced.html",
+ selected: pageElem.id == "advancedConfigurationPage"
+ }, {
+ name: "Scheduled Tasks",
+ href: "scheduledTasks.html",
+ selected: pageElem.id == "scheduledTasksPage" || pageElem.id == "scheduledTaskPage"
+ }, {
+ name: "Help",
+ href: "support.html",
+ selected: pageElem.id == "supportPage" || pageElem.id == "logPage" || pageElem.id == "supporterPage" || pageElem.id == "supporterKeyPage"
+ }];
+
+ },
+
+ ensureWebSocket: function (systemInfo) {
+
+ if (!("WebSocket" in window)) {
+ // Not supported by the browser
+ return;
+ }
+
+ if (Dashboard.webSocket) {
+ if (Dashboard.webSocket.readyState === WebSocket.OPEN || Dashboard.webSocket.readyState === WebSocket.CONNECTING) {
+ return;
+ }
+ }
+
+ systemInfo = systemInfo || Dashboard.lastSystemInfo;
+
+ var url = "ws://" + ApiClient.serverHostName + ":" + systemInfo.WebSocketPortNumber + "/mediabrowser";
+
+ var ws = new WebSocket(url);
+
+ ws.onmessage = Dashboard.onWebSocketMessage;
+
+ ws.onopen = function () {
+ setTimeout(function () {
+ $(document).trigger("websocketopen");
+ }, 500);
+ };
+ ws.onerror = function () {
+ setTimeout(function () {
+ $(document).trigger("websocketerror");
+ }, 0);
+ };
+ ws.onclose = function () {
+ setTimeout(function () {
+ $(document).trigger("websocketclose");
+ }, 0);
+ };
+
+ Dashboard.webSocket = ws;
+ },
+
+ resetWebSocketPingInterval: function () {
+
+ if (Dashboard.pingWebSocketInterval) {
+ clearInterval(Dashboard.pingWebSocketInterval);
+ Dashboard.pingWebSocketInterval = null;
+ }
+ Dashboard.pingWebSocketInterval = setInterval(Dashboard.pingWebSocket, 30000);
+ },
+
+ pingWebSocket: function () {
+
+ // Send a ping to the server every so often to try and keep the connection alive
+ if (Dashboard.isWebSocketOpen()) {
+ Dashboard.sendWebSocketMessage("ping");
+ }
+
+ },
+
+ onWebSocketMessage: function (msg) {
+
+ msg = JSON.parse(msg.data);
+
+ if (msg.MessageType === "LibraryChanged") {
+ Dashboard.processLibraryUpdateNotification(msg.Data);
+ }
+ else if (msg.MessageType === "UserDeleted") {
+ Dashboard.validateCurrentUser();
+ }
+ else if (msg.MessageType === "SystemInfo") {
+ Dashboard.updateSystemInfo(msg.Data);
+ }
+ else if (msg.MessageType === "HasPendingRestartChanged") {
+ Dashboard.updateSystemInfo(msg.Data);
+ }
+ else if (msg.MessageType === "UserUpdated") {
+ Dashboard.validateCurrentUser();
+
+ var user = msg.Data;
+
+ if (user.Id == Dashboard.getCurrentUserId()) {
+
+ $('.currentUsername').html(user.Name);
+ }
+ }
+ else if (msg.MessageType === "PackageInstallationCompleted") {
+ Dashboard.showPackageInstallNotification(msg.Data, "completed");
+ Dashboard.refreshSystemInfoFromServer();
+ }
+ else if (msg.MessageType === "PackageInstallationFailed") {
+ Dashboard.showPackageInstallNotification(msg.Data, "failed");
+ Dashboard.refreshSystemInfoFromServer();
+ }
+ else if (msg.MessageType === "PackageInstallationCancelled") {
+ Dashboard.showPackageInstallNotification(msg.Data, "cancelled");
+ Dashboard.refreshSystemInfoFromServer();
+ }
+ else if (msg.MessageType === "PackageInstalling") {
+ Dashboard.showPackageInstallNotification(msg.Data, "progress");
+ Dashboard.refreshSystemInfoFromServer();
+ }
+ else if (msg.MessageType === "ScheduledTaskEndExecute") {
+
+ Dashboard.showTaskCompletionNotification(msg.Data);
+ }
+
+ $(document).trigger("websocketmessage", [msg]);
+ },
+
+ sendWebSocketMessage: function (name, data) {
+
+ var msg = { MessageType: name };
+
+ if (data) {
+ msg.Data = data;
+ }
+
+ msg = JSON.stringify(msg);
+
+ Dashboard.webSocket.send(msg);
+ },
+
+ isWebSocketOpen: function () {
+ return Dashboard.webSocket && Dashboard.webSocket.readyState === WebSocket.OPEN;
+ },
+
+ showTaskCompletionNotification: function (result) {
+
+ var html = '';
+
+ if (result.Status == "Completed") {
+ html += '<img src="css/images/notifications/done.png" class="notificationIcon" />';
+ return;
+ }
+ else if (result.Status == "Cancelled") {
+ html += '<img src="css/images/notifications/info.png" class="notificationIcon" />';
+ return;
+ }
+ else {
+ html += '<img src="css/images/notifications/error.png" class="notificationIcon" />';
+ }
+
+ html += '<span>';
+ html += result.Name + " " + result.Status;
+ html += '</span>';
+
+ var timeout = 0;
+
+ if (result.Status == 'Cancelled') {
+ timeout = 2000;
+ }
+
+ Dashboard.showFooterNotification({ html: html, id: result.Id, forceShow: true, timeout: timeout });
+ },
+
+ showPackageInstallNotification: function (installation, status) {
+
+ var html = '';
+
+ if (status == 'completed') {
+ html += '<img src="css/images/notifications/done.png" class="notificationIcon" />';
+ }
+ else if (status == 'cancelled') {
+ html += '<img src="css/images/notifications/info.png" class="notificationIcon" />';
+ }
+ else if (status == 'failed') {
+ html += '<img src="css/images/notifications/error.png" class="notificationIcon" />';
+ }
+ else if (status == 'progress') {
+ html += '<img src="css/images/notifications/download.png" class="notificationIcon" />';
+ }
+
+ html += '<span style="margin-right: 1em;">';
+
+ if (status == 'completed') {
+ html += installation.Name + ' ' + installation.Version + ' installation completed';
+ }
+ else if (status == 'cancelled') {
+ html += installation.Name + ' ' + installation.Version + ' installation was cancelled';
+ }
+ else if (status == 'failed') {
+ html += installation.Name + ' ' + installation.Version + ' installation failed';
+ }
+ else if (status == 'progress') {
+ html += 'Installing ' + installation.Name + ' ' + installation.Version;
+ }
+
+ html += '</span>';
+
+ if (status == 'progress') {
+
+ var percentComplete = Math.round(installation.PercentComplete || 0);
+
+ html += '<progress style="margin-right: 1em;" max="100" value="' + percentComplete + '" title="' + percentComplete + '%">';
+ html += '' + percentComplete + '%';
+ html += '</progress>';
+
+ if (percentComplete < 100) {
+ var btnId = "btnCancel" + installation.Id;
+ html += '<button id="' + btnId + '" type="button" data-icon="delete" onclick="$(\'' + btnId + '\').button(\'disable\');Dashboard.cancelInstallation(\'' + installation.Id + '\');" data-theme="b" data-inline="true" data-mini="true">Cancel</button>';
+ }
+ }
+
+ var timeout = 0;
+
+ if (status == 'cancelled') {
+ timeout = 2000;
+ }
+
+ var forceShow = status != "progress";
+ var allowHide = status != "progress" && status != 'cancelled';
+
+ Dashboard.showFooterNotification({ html: html, id: installation.Id, timeout: timeout, forceShow: forceShow, allowHide: allowHide });
+ },
+
+ processLibraryUpdateNotification: function (data) {
+
+ var newItems = data.ItemsAdded.filter(function (a) {
+ return !a.IsFolder;
+ });
+
+ if (!Dashboard.newItems) {
+ Dashboard.newItems = [];
+ }
+
+ for (var i = 0, length = newItems.length ; i < length; i++) {
+
+ Dashboard.newItems.push(newItems[i]);
+ }
+
+ if (Dashboard.newItemTimeout) {
+ clearTimeout(Dashboard.newItemTimeout);
+ }
+
+ Dashboard.newItemTimeout = setTimeout(Dashboard.onNewItemTimerStopped, 60000);
+ },
+
+ onNewItemTimerStopped: function () {
+
+ var newItems = Dashboard.newItems;
+
+ newItems = newItems.sort(function (a, b) {
+
+ if (a.PrimaryImageTag && b.PrimaryImageTag) {
+ return 0;
+ }
+
+ if (a.PrimaryImageTag) {
+ return -1;
+ }
+
+ return 1;
+ });
+
+ Dashboard.newItems = [];
+ Dashboard.newItemTimeout = null;
+
+ // Show at most 3 notifications
+ for (var i = 0, length = Math.min(newItems.length, 3) ; i < length; i++) {
+
+ var item = newItems[i];
+
+ var data = {
+ title: "New " + item.Type,
+ body: item.Name,
+ timeout: 6000
+ };
+
+ if (item.PrimaryImageTag) {
+ data.icon = ApiClient.getImageUrl(item.Id, {
+ width: 100,
+ tag: item.PrimaryImageTag
+ });
+ }
+
+ WebNotifications.show(data);
+ }
+ },
+
+ ensurePageTitle: function (page) {
+
+ if (!page.hasClass('type-interior')) {
+ return;
+ }
+
+ var pageElem = page[0];
+
+ if (pageElem.hasPageTitle) {
+ return;
+ }
+
+ var parent = $('.content-primary', page);
+
+ if (!parent.length) {
+ parent = $('.ui-content', page)[0];
+ }
+
+ $(parent).prepend("<h2 class='pageTitle'>" + (document.title || "&nbsp;") + "</h2>");
+
+ pageElem.hasPageTitle = true;
+ },
+
+ setPageTitle: function (title) {
+
+ $('.pageTitle', $.mobile.activePage).html(title);
+
+ if (title) {
+ document.title = title;
+ }
+ },
+
+ metroColors: ["#6FBD45", "#4BB3DD", "#4164A5", "#E12026", "#800080", "#E1B222", "#008040", "#0094FF", "#FF00C7", "#FF870F", "#7F0037"],
+
+ getRandomMetroColor: function () {
+
+ var index = Math.floor(Math.random() * (Dashboard.metroColors.length - 1));
+
+ return Dashboard.metroColors[index];
+ }
+
+};
+
+$(function () {
+
+ var footerHtml = '<div id="footer" class="ui-bar-a">';
+
+ footerHtml += '<div id="nowPlayingBar" style="display:none;">';
+
+ footerHtml += '<button id="previousTrackButton" class="imageButton mediaButton" title="Previous Track" type="button"><img src="css/images/media/previousTrack.png" /></button>';
+
+ footerHtml += '<button id="stopButton" class="imageButton mediaButton" title="Stop" type="button" onclick="MediaPlayer.stop();"><img src="css/images/media/stop.png" /></button>';
+
+ footerHtml += '<button id="nextTrackButton" class="imageButton mediaButton" title="Next Track" type="button"><img src="css/images/media/nextTrack.png" /></button>';
+
+ footerHtml += '<div id="mediaElement"></div>';
+
+ footerHtml += '</div>';
+
+ footerHtml += '<div id="footerNotifications"></div>';
+
+ footerHtml += '</div>';
+
+
+ $(document.body).append(footerHtml);
+});
+
+Dashboard.jQueryMobileInit();
+
+$(document).on('pagebeforeshow', ".page", function () {
+
+ Dashboard.refreshSystemInfoFromServer();
+
+ var page = $(this);
+
+ Dashboard.ensureHeader(page);
+ Dashboard.ensurePageTitle(page);
+
+}).on('pageinit', ".page", function () {
+
+ var page = $(this);
+ var hasLogin = Dashboard.getCurrentUserId();
+
+ if (!hasLogin) {
+
+ if (this.id !== "loginPage" && !page.hasClass('wizardPage')) {
+
+ Dashboard.logout();
+ }
+ }
+
+ else {
+
+ Dashboard.getCurrentUser().done(function (user) {
+
+ if (user.Configuration.IsAdministrator) {
+ Dashboard.ensureToolsMenu(page);
+ }
+ });
+ }
}); \ No newline at end of file
diff --git a/MediaBrowser.WebDashboard/MediaBrowser.WebDashboard.csproj b/MediaBrowser.WebDashboard/MediaBrowser.WebDashboard.csproj
index b18a2a832..85efe04f1 100644
--- a/MediaBrowser.WebDashboard/MediaBrowser.WebDashboard.csproj
+++ b/MediaBrowser.WebDashboard/MediaBrowser.WebDashboard.csproj
@@ -1,416 +1,413 @@
-<?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>{5624B7B5-B5A7-41D8-9F10-CC5611109619}</ProjectGuid>
- <OutputType>Library</OutputType>
- <AppDesignerFolder>Properties</AppDesignerFolder>
- <RootNamespace>MediaBrowser.WebDashboard</RootNamespace>
- <AssemblyName>MediaBrowser.WebDashboard</AssemblyName>
- <TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
- <FileAlignment>512</FileAlignment>
- <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\</SolutionDir>
- <RestorePackages>true</RestorePackages>
- </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>
- <PropertyGroup>
- <RunPostBuildEvent>Always</RunPostBuildEvent>
- </PropertyGroup>
- <ItemGroup>
- <Reference Include="ServiceStack, Version=3.9.37.0, Culture=neutral, processorArchitecture=MSIL">
- <SpecificVersion>False</SpecificVersion>
- <HintPath>..\packages\ServiceStack.3.9.37\lib\net35\ServiceStack.dll</HintPath>
- </Reference>
- <Reference Include="ServiceStack.Common, Version=3.9.37.0, Culture=neutral, processorArchitecture=MSIL">
- <SpecificVersion>False</SpecificVersion>
- <HintPath>..\packages\ServiceStack.Common.3.9.37\lib\net35\ServiceStack.Common.dll</HintPath>
- </Reference>
- <Reference Include="ServiceStack.Interfaces, Version=3.9.37.0, Culture=neutral, processorArchitecture=MSIL">
- <SpecificVersion>False</SpecificVersion>
- <HintPath>..\packages\ServiceStack.Common.3.9.37\lib\net35\ServiceStack.Interfaces.dll</HintPath>
- </Reference>
- <Reference Include="ServiceStack.OrmLite, Version=3.9.37.0, Culture=neutral, processorArchitecture=MSIL">
- <SpecificVersion>False</SpecificVersion>
- <HintPath>..\packages\ServiceStack.OrmLite.SqlServer.3.9.37\lib\ServiceStack.OrmLite.dll</HintPath>
- </Reference>
- <Reference Include="ServiceStack.OrmLite.SqlServer, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL">
- <SpecificVersion>False</SpecificVersion>
- <HintPath>..\packages\ServiceStack.OrmLite.SqlServer.3.9.37\lib\ServiceStack.OrmLite.SqlServer.dll</HintPath>
- </Reference>
- <Reference Include="ServiceStack.Redis, Version=3.9.37.0, Culture=neutral, processorArchitecture=MSIL">
- <SpecificVersion>False</SpecificVersion>
- <HintPath>..\packages\ServiceStack.Redis.3.9.37\lib\net35\ServiceStack.Redis.dll</HintPath>
- </Reference>
- <Reference Include="ServiceStack.ServiceInterface, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL">
- <SpecificVersion>False</SpecificVersion>
- <HintPath>..\packages\ServiceStack.3.9.37\lib\net35\ServiceStack.ServiceInterface.dll</HintPath>
- </Reference>
- <Reference Include="ServiceStack.Text, Version=3.9.37.0, Culture=neutral, processorArchitecture=MSIL">
- <SpecificVersion>False</SpecificVersion>
- <HintPath>..\packages\ServiceStack.Text.3.9.37\lib\net35\ServiceStack.Text.dll</HintPath>
- </Reference>
- <Reference Include="System" />
- <Reference Include="System.ComponentModel.Composition" />
- <Reference Include="System.Core" />
- <Reference Include="System.Runtime.Serialization" />
- <Reference Include="System.Xml.Linq" />
- <Reference Include="System.Data.DataSetExtensions" />
- <Reference Include="Microsoft.CSharp" />
- <Reference Include="System.Data" />
- <Reference Include="System.Xml" />
- </ItemGroup>
- <ItemGroup>
- <Compile Include="..\SharedVersion.cs">
- <Link>Properties\SharedVersion.cs</Link>
- </Compile>
- <Compile Include="Api\DashboardInfo.cs" />
- <Compile Include="Api\DashboardService.cs" />
- <Compile Include="Api\DashboardInfoWebSocketListener.cs" />
- <Compile Include="Properties\AssemblyInfo.cs" />
- </ItemGroup>
- <ItemGroup>
- <ProjectReference Include="..\MediaBrowser.Common\MediaBrowser.Common.csproj">
- <Project>{9142eefa-7570-41e1-bfcc-468bb571af2f}</Project>
- <Name>MediaBrowser.Common</Name>
- </ProjectReference>
- <ProjectReference Include="..\MediaBrowser.Controller\MediaBrowser.Controller.csproj">
- <Project>{17e1f4e6-8abd-4fe5-9ecf-43d4b6087ba2}</Project>
- <Name>MediaBrowser.Controller</Name>
- </ProjectReference>
- <ProjectReference Include="..\MediaBrowser.Model\MediaBrowser.Model.csproj">
- <Project>{7eeeb4bb-f3e8-48fc-b4c5-70f0fff8329b}</Project>
- <Name>MediaBrowser.Model</Name>
- </ProjectReference>
- </ItemGroup>
- <ItemGroup>
- <EmbeddedResource Include="Html\index.html" />
- </ItemGroup>
- <ItemGroup>
- <EmbeddedResource Include="Html\advanced.html" />
- </ItemGroup>
- <ItemGroup>
- <EmbeddedResource Include="Html\dashboard.html" />
- </ItemGroup>
- <ItemGroup>
- <EmbeddedResource Include="Html\scripts\Site.js" />
- </ItemGroup>
- <ItemGroup>
- <EmbeddedResource Include="Html\css\site.css" />
- </ItemGroup>
- <ItemGroup>
- <EmbeddedResource Include="Html\library.html" />
- </ItemGroup>
- <ItemGroup>
- <EmbeddedResource Include="Html\metadata.html" />
- </ItemGroup>
- <ItemGroup>
- <EmbeddedResource Include="Html\userProfiles.html" />
- </ItemGroup>
- <ItemGroup>
- <EmbeddedResource Include="Html\plugins.html" />
- </ItemGroup>
- <ItemGroup>
- <EmbeddedResource Include="Html\login.html" />
- </ItemGroup>
- <ItemGroup>
- <EmbeddedResource Include="Html\css\images\logindefault.png" />
- </ItemGroup>
- <ItemGroup>
- <EmbeddedResource Include="Html\uiSettings.html" />
- </ItemGroup>
- <ItemGroup>
- <EmbeddedResource Include="Html\editUser.html" />
- </ItemGroup>
- <ItemGroup>
- <EmbeddedResource Include="Html\favicon.ico" />
- </ItemGroup>
- <ItemGroup>
- <EmbeddedResource Include="Html\css\images\touchicon.png" />
- <EmbeddedResource Include="Html\css\images\touchicon114.png" />
- <EmbeddedResource Include="Html\css\images\touchicon72.png" />
- </ItemGroup>
- <ItemGroup>
- <EmbeddedResource Include="Html\css\images\iossplash.png" />
- </ItemGroup>
- <ItemGroup>
- <EmbeddedResource Include="Html\updatePassword.html" />
- </ItemGroup>
- <ItemGroup>
- <EmbeddedResource Include="Html\userImage.html" />
- </ItemGroup>
- <ItemGroup>
- <EmbeddedResource Include="Html\scripts\IndexPage.js" />
- </ItemGroup>
- <ItemGroup>
- <EmbeddedResource Include="Html\css\images\mblogowhitefull.png" />
- </ItemGroup>
- <ItemGroup>
- <EmbeddedResource Include="Html\css\images\mblogoblackfull.png" />
- </ItemGroup>
- <ItemGroup>
- <EmbeddedResource Include="Html\css\images\defaultCollectionImage.png" />
- </ItemGroup>
- <ItemGroup>
- <EmbeddedResource Include="Html\css\images\toolsWhite.png" />
- </ItemGroup>
- <ItemGroup>
- <EmbeddedResource Include="Html\css\images\currentUserDefaultWhite.png" />
- </ItemGroup>
- <ItemGroup>
- <EmbeddedResource Include="Html\css\images\rightArrow.png" />
- </ItemGroup>
- <ItemGroup>
- <EmbeddedResource Include="Html\css\images\userFlyoutDefault.png" />
- </ItemGroup>
- <ItemGroup>
- <EmbeddedResource Include="Html\scripts\MediaLibraryPage.js" />
- </ItemGroup>
- <ItemGroup>
- <EmbeddedResource Include="Html\scripts\DisplaySettingsPage.js" />
- </ItemGroup>
- <ItemGroup>
- <EmbeddedResource Include="Html\scripts\PluginsPage.js" />
- </ItemGroup>
- <ItemGroup>
- <EmbeddedResource Include="Html\scripts\MetadataConfigurationPage.js" />
- </ItemGroup>
- <ItemGroup>
- <EmbeddedResource Include="Html\scripts\LoginPage.js" />
- </ItemGroup>
- <ItemGroup>
- <EmbeddedResource Include="Html\scripts\UpdatePasswordPage.js" />
- </ItemGroup>
- <ItemGroup>
- <EmbeddedResource Include="Html\scripts\AdvancedConfigurationPage.js" />
- <EmbeddedResource Include="Html\scripts\EditUserPage.js" />
- <EmbeddedResource Include="Html\scripts\UserImagePage.js" />
- <EmbeddedResource Include="Html\scripts\UserProfilesPage.js" />
- </ItemGroup>
- <ItemGroup>
- <EmbeddedResource Include="Html\advancedMetadata.html" />
- </ItemGroup>
- <ItemGroup>
- <EmbeddedResource Include="Html\scripts\AdvancedMetadataConfigurationPage.js" />
- </ItemGroup>
- <ItemGroup>
- <EmbeddedResource Include="Html\pluginUpdates.html" />
- </ItemGroup>
- <ItemGroup>
- <EmbeddedResource Include="Html\scripts\PluginUpdatesPage.js" />
- </ItemGroup>
- <ItemGroup>
- <EmbeddedResource Include="Html\addPlugin.html" />
- <EmbeddedResource Include="Html\scripts\AddPluginPage.js" />
- </ItemGroup>
- <ItemGroup>
- <EmbeddedResource Include="Html\css\images\bg.png" />
- </ItemGroup>
- <ItemGroup>
- <EmbeddedResource Include="Html\pluginCatalog.html" />
- <EmbeddedResource Include="Html\scripts\PluginCatalogPage.js" />
- </ItemGroup>
- <ItemGroup>
- <EmbeddedResource Include="Html\css\images\leftArrowBlack.png" />
- </ItemGroup>
- <ItemGroup>
- <EmbeddedResource Include="Html\css\images\leftArrowWhite.png" />
- </ItemGroup>
- <ItemGroup>
- <EmbeddedResource Include="Html\css\images\currentUserDefaultBlack.png" />
- <EmbeddedResource Include="Html\css\images\toolsBlack.png" />
- </ItemGroup>
- <ItemGroup>
- <EmbeddedResource Include="Html\scheduledTasks.html" />
- </ItemGroup>
- <ItemGroup>
- <EmbeddedResource Include="Html\scripts\ScheduledTasksPage.js" />
- </ItemGroup>
- <ItemGroup>
- <EmbeddedResource Include="Html\scheduledTask.html" />
- <EmbeddedResource Include="Html\scripts\ScheduledTaskPage.js" />
- </ItemGroup>
- <ItemGroup>
- <EmbeddedResource Include="Html\wizardStart.html" />
- </ItemGroup>
- <ItemGroup>
- <EmbeddedResource Include="Html\wizardFinish.html" />
- </ItemGroup>
- <ItemGroup>
- <EmbeddedResource Include="Html\wizardUser.html" />
- <EmbeddedResource Include="Html\wizardLibrary.html" />
- </ItemGroup>
- <ItemGroup>
- <EmbeddedResource Include="Html\scripts\WizardStartPage.js" />
- </ItemGroup>
- <ItemGroup>
- <EmbeddedResource Include="Html\scripts\WizardUserPage.js" />
- </ItemGroup>
- <ItemGroup>
- <EmbeddedResource Include="Html\css\images\cloudNetwork.png" />
- </ItemGroup>
- <ItemGroup>
- <EmbeddedResource Include="Html\css\images\movieFolder.png" />
- </ItemGroup>
- <ItemGroup>
- <EmbeddedResource Include="Html\css\images\checkmarkblack.png" />
- </ItemGroup>
- <ItemGroup>
- <EmbeddedResource Include="Html\log.html" />
- </ItemGroup>
- <ItemGroup>
- <EmbeddedResource Include="Html\scripts\LogPage.js" />
- </ItemGroup>
- <ItemGroup>
- <EmbeddedResource Include="Html\metadataImages.html" />
- </ItemGroup>
- <ItemGroup>
- <EmbeddedResource Include="Html\scripts\MetadataImagesPage.js" />
- </ItemGroup>
- <ItemGroup>
- <EmbeddedResource Include="Html\scripts\DashboardPage.js" />
- </ItemGroup>
- <ItemGroup>
- <EmbeddedResource Include="Html\css\images\checkMarkGreen.png" />
- </ItemGroup>
- <ItemGroup>
- <EmbeddedResource Include="Html\css\images\clients\html5.png" />
- </ItemGroup>
- <ItemGroup>
- <EmbeddedResource Include="Html\css\images\clients\android.png" />
- <EmbeddedResource Include="Html\css\images\clients\ios.png" />
- </ItemGroup>
- <ItemGroup>
- <EmbeddedResource Include="Html\css\images\clients\mb.png" />
- </ItemGroup>
- <ItemGroup>
- <EmbeddedResource Include="Html\css\images\clients\windowsrt.png" />
- </ItemGroup>
- <ItemGroup>
- <EmbeddedResource Include="Html\css\images\clients\windowsphone.png" />
- <EmbeddedResource Include="Html\css\images\clients\win8.png" />
- </ItemGroup>
- <ItemGroup>
- <EmbeddedResource Include="Html\css\images\notifications\download.png" />
- </ItemGroup>
- <ItemGroup>
- <EmbeddedResource Include="Html\scripts\Extensions.js" />
- </ItemGroup>
- <ItemGroup>
- <EmbeddedResource Include="Html\support.html" />
- </ItemGroup>
- <ItemGroup>
- <EmbeddedResource Include="Html\scripts\SupporterPage.js" />
- </ItemGroup>
- <ItemGroup>
- <EmbeddedResource Include="Html\supporter.html" />
- </ItemGroup>
- <ItemGroup>
- <EmbeddedResource Include="Html\css\images\suppbadge.png" />
- </ItemGroup>
- <ItemGroup>
- <EmbeddedResource Include="Html\css\images\premiumflag.png" />
- </ItemGroup>
- <ItemGroup>
- <EmbeddedResource Include="Html\supporterKey.html" />
- </ItemGroup>
- <ItemGroup>
- <EmbeddedResource Include="Html\scripts\SupporterKeyPage.js" />
- </ItemGroup>
- <ItemGroup>
- <EmbeddedResource Include="Html\css\images\donatepp.png" />
- </ItemGroup>
- <ItemGroup>
- <EmbeddedResource Include="Html\thirdparty\jqm-icon-pack-3.0\font-awesome\faicons-v2.png" />
- <EmbeddedResource Include="Html\thirdparty\jqm-icon-pack-3.0\font-awesome\faicons.png" />
- <EmbeddedResource Include="Html\thirdparty\jqm-icon-pack-3.0\font-awesome\images\ajax-loader.png" />
- <EmbeddedResource Include="Html\thirdparty\jqm-icon-pack-3.0\font-awesome\images\icons-18-black-pack.png" />
- <EmbeddedResource Include="Html\thirdparty\jqm-icon-pack-3.0\font-awesome\images\icons-18-white-pack.png" />
- <EmbeddedResource Include="Html\thirdparty\jqm-icon-pack-3.0\font-awesome\images\icons-36-black-pack.png" />
- <EmbeddedResource Include="Html\thirdparty\jqm-icon-pack-3.0\font-awesome\images\icons-36-white-pack.png" />
- <EmbeddedResource Include="Html\thirdparty\jqm-icon-pack-3.0\font-awesome\index.html" />
- <EmbeddedResource Include="Html\thirdparty\jqm-icon-pack-3.0\font-awesome\jqm-icon-pack-3.0.0-fa.css" />
- <EmbeddedResource Include="Html\thirdparty\jqm-icon-pack-3.0\original\images\ajax-loader.gif" />
- <EmbeddedResource Include="Html\thirdparty\jqm-icon-pack-3.0\original\images\ajax-loader.png" />
- <EmbeddedResource Include="Html\thirdparty\jqm-icon-pack-3.0\original\images\icons-18-black-pack.png" />
- <EmbeddedResource Include="Html\thirdparty\jqm-icon-pack-3.0\original\images\icons-18-white-pack.png" />
- <EmbeddedResource Include="Html\thirdparty\jqm-icon-pack-3.0\original\images\icons-36-black-pack.png" />
- <EmbeddedResource Include="Html\thirdparty\jqm-icon-pack-3.0\original\images\icons-36-white-pack.png" />
- <EmbeddedResource Include="Html\thirdparty\jqm-icon-pack-3.0\original\index.html" />
- <EmbeddedResource Include="Html\thirdparty\jqm-icon-pack-3.0\original\jqm-icon-pack-2.0-original.css" />
- </ItemGroup>
- <ItemGroup>
- <EmbeddedResource Include="Html\thirdparty\jqm-icon-pack-3.0\font-awesome\font\fontawesome-webfont.eot" />
- <EmbeddedResource Include="Html\thirdparty\jqm-icon-pack-3.0\font-awesome\font\fontawesome-webfont.ttf" />
- <EmbeddedResource Include="Html\thirdparty\jqm-icon-pack-3.0\font-awesome\font\fontawesome-webfont.woff" />
- <EmbeddedResource Include="Html\thirdparty\jqm-icon-pack-3.0\font-awesome\font\FontAwesome.otf" />
- <EmbeddedResource Include="Html\thirdparty\jqm-icon-pack-3.0\font-awesome\jqm-icon-pack-3.0.0-fa.scss" />
- </ItemGroup>
- <ItemGroup>
- <EmbeddedResource Include="Html\css\images\registerpp.png" />
- </ItemGroup>
- <ItemGroup>
- <EmbeddedResource Include="Html\css\images\home.png" />
- </ItemGroup>
- <ItemGroup>
- <EmbeddedResource Include="Html\css\images\notifications\done.png" />
- <EmbeddedResource Include="Html\css\images\notifications\error.png" />
- </ItemGroup>
- <ItemGroup>
- <EmbeddedResource Include="Html\css\images\notifications\cancelled.png" />
- </ItemGroup>
- <ItemGroup>
- <EmbeddedResource Include="Html\css\images\notifications\info.png" />
- </ItemGroup>
- <ItemGroup>
- <EmbeddedResource Include="Html\itemDetails.html" />
- </ItemGroup>
- <ItemGroup>
- <EmbeddedResource Include="Html\scripts\ItemDetailPage.js" />
- </ItemGroup>
- <ItemGroup>
- <EmbeddedResource Include="Html\css\images\media\playCircle.png" />
- <EmbeddedResource Include="Html\css\images\media\nextTrack.png" />
- <EmbeddedResource Include="Html\css\images\media\pause.png" />
- <EmbeddedResource Include="Html\css\images\media\play.png" />
- <EmbeddedResource Include="Html\css\images\media\previousTrack.png" />
- <EmbeddedResource Include="Html\css\images\media\stop.png" />
- <EmbeddedResource Include="Html\css\images\itemDetails\videoDefault.png" />
- <EmbeddedResource Include="Html\css\images\itemDetails\audioDefault.png" />
- <EmbeddedResource Include="Html\css\images\itemDetails\gameDefault.png" />
- <Content Include="Html\css\images\stars.png" />
- <EmbeddedResource Include="Html\scripts\MediaPlayer.js" />
- </ItemGroup>
- <ItemGroup>
- <None Include="packages.config" />
- </ItemGroup>
- <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
- <PropertyGroup>
- <PostBuildEvent>xcopy "$(TargetPath)" "$(SolutionDir)\MediaBrowser.ServerApplication\CorePlugins\" /y</PostBuildEvent>
- </PropertyGroup>
- <Import Project="$(SolutionDir)\.nuget\nuget.targets" />
- <!-- 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>
- -->
+<?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>{5624B7B5-B5A7-41D8-9F10-CC5611109619}</ProjectGuid>
+ <OutputType>Library</OutputType>
+ <AppDesignerFolder>Properties</AppDesignerFolder>
+ <RootNamespace>MediaBrowser.WebDashboard</RootNamespace>
+ <AssemblyName>MediaBrowser.WebDashboard</AssemblyName>
+ <TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
+ <FileAlignment>512</FileAlignment>
+ <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\</SolutionDir>
+ <RestorePackages>true</RestorePackages>
+ </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>
+ <PropertyGroup>
+ <RunPostBuildEvent>Always</RunPostBuildEvent>
+ </PropertyGroup>
+ <ItemGroup>
+ <Reference Include="ServiceStack, Version=3.9.37.0, Culture=neutral, processorArchitecture=MSIL">
+ <SpecificVersion>False</SpecificVersion>
+ <HintPath>..\packages\ServiceStack.3.9.37\lib\net35\ServiceStack.dll</HintPath>
+ </Reference>
+ <Reference Include="ServiceStack.Common, Version=3.9.37.0, Culture=neutral, processorArchitecture=MSIL">
+ <SpecificVersion>False</SpecificVersion>
+ <HintPath>..\packages\ServiceStack.Common.3.9.37\lib\net35\ServiceStack.Common.dll</HintPath>
+ </Reference>
+ <Reference Include="ServiceStack.Interfaces, Version=3.9.37.0, Culture=neutral, processorArchitecture=MSIL">
+ <SpecificVersion>False</SpecificVersion>
+ <HintPath>..\packages\ServiceStack.Common.3.9.37\lib\net35\ServiceStack.Interfaces.dll</HintPath>
+ </Reference>
+ <Reference Include="ServiceStack.OrmLite, Version=3.9.37.0, Culture=neutral, processorArchitecture=MSIL">
+ <SpecificVersion>False</SpecificVersion>
+ <HintPath>..\packages\ServiceStack.OrmLite.SqlServer.3.9.37\lib\ServiceStack.OrmLite.dll</HintPath>
+ </Reference>
+ <Reference Include="ServiceStack.OrmLite.SqlServer, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL">
+ <SpecificVersion>False</SpecificVersion>
+ <HintPath>..\packages\ServiceStack.OrmLite.SqlServer.3.9.37\lib\ServiceStack.OrmLite.SqlServer.dll</HintPath>
+ </Reference>
+ <Reference Include="ServiceStack.Redis, Version=3.9.37.0, Culture=neutral, processorArchitecture=MSIL">
+ <SpecificVersion>False</SpecificVersion>
+ <HintPath>..\packages\ServiceStack.Redis.3.9.37\lib\net35\ServiceStack.Redis.dll</HintPath>
+ </Reference>
+ <Reference Include="ServiceStack.ServiceInterface, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL">
+ <SpecificVersion>False</SpecificVersion>
+ <HintPath>..\packages\ServiceStack.3.9.37\lib\net35\ServiceStack.ServiceInterface.dll</HintPath>
+ </Reference>
+ <Reference Include="ServiceStack.Text, Version=3.9.37.0, Culture=neutral, processorArchitecture=MSIL">
+ <SpecificVersion>False</SpecificVersion>
+ <HintPath>..\packages\ServiceStack.Text.3.9.37\lib\net35\ServiceStack.Text.dll</HintPath>
+ </Reference>
+ <Reference Include="System" />
+ <Reference Include="System.ComponentModel.Composition" />
+ <Reference Include="System.Core" />
+ <Reference Include="System.Runtime.Serialization" />
+ <Reference Include="System.Xml.Linq" />
+ <Reference Include="System.Data.DataSetExtensions" />
+ <Reference Include="Microsoft.CSharp" />
+ <Reference Include="System.Data" />
+ <Reference Include="System.Xml" />
+ </ItemGroup>
+ <ItemGroup>
+ <Compile Include="..\SharedVersion.cs">
+ <Link>Properties\SharedVersion.cs</Link>
+ </Compile>
+ <Compile Include="Api\DashboardInfo.cs" />
+ <Compile Include="Api\DashboardService.cs" />
+ <Compile Include="Api\DashboardInfoWebSocketListener.cs" />
+ <Compile Include="Properties\AssemblyInfo.cs" />
+ </ItemGroup>
+ <ItemGroup>
+ <ProjectReference Include="..\MediaBrowser.Common\MediaBrowser.Common.csproj">
+ <Project>{9142eefa-7570-41e1-bfcc-468bb571af2f}</Project>
+ <Name>MediaBrowser.Common</Name>
+ </ProjectReference>
+ <ProjectReference Include="..\MediaBrowser.Controller\MediaBrowser.Controller.csproj">
+ <Project>{17e1f4e6-8abd-4fe5-9ecf-43d4b6087ba2}</Project>
+ <Name>MediaBrowser.Controller</Name>
+ </ProjectReference>
+ <ProjectReference Include="..\MediaBrowser.Model\MediaBrowser.Model.csproj">
+ <Project>{7eeeb4bb-f3e8-48fc-b4c5-70f0fff8329b}</Project>
+ <Name>MediaBrowser.Model</Name>
+ </ProjectReference>
+ </ItemGroup>
+ <ItemGroup>
+ <EmbeddedResource Include="Html\index.html" />
+ </ItemGroup>
+ <ItemGroup>
+ <EmbeddedResource Include="Html\advanced.html" />
+ </ItemGroup>
+ <ItemGroup>
+ <EmbeddedResource Include="Html\dashboard.html" />
+ </ItemGroup>
+ <ItemGroup>
+ <EmbeddedResource Include="Html\scripts\Site.js" />
+ </ItemGroup>
+ <ItemGroup>
+ <EmbeddedResource Include="Html\css\site.css" />
+ </ItemGroup>
+ <ItemGroup>
+ <EmbeddedResource Include="Html\library.html" />
+ </ItemGroup>
+ <ItemGroup>
+ <EmbeddedResource Include="Html\metadata.html" />
+ </ItemGroup>
+ <ItemGroup>
+ <EmbeddedResource Include="Html\userProfiles.html" />
+ </ItemGroup>
+ <ItemGroup>
+ <EmbeddedResource Include="Html\plugins.html" />
+ </ItemGroup>
+ <ItemGroup>
+ <EmbeddedResource Include="Html\login.html" />
+ </ItemGroup>
+ <ItemGroup>
+ <EmbeddedResource Include="Html\css\images\logindefault.png" />
+ </ItemGroup>
+ <ItemGroup>
+ <EmbeddedResource Include="Html\uiSettings.html" />
+ </ItemGroup>
+ <ItemGroup>
+ <EmbeddedResource Include="Html\editUser.html" />
+ </ItemGroup>
+ <ItemGroup>
+ <EmbeddedResource Include="Html\favicon.ico" />
+ </ItemGroup>
+ <ItemGroup>
+ <EmbeddedResource Include="Html\css\images\touchicon.png" />
+ <EmbeddedResource Include="Html\css\images\touchicon114.png" />
+ <EmbeddedResource Include="Html\css\images\touchicon72.png" />
+ </ItemGroup>
+ <ItemGroup>
+ <EmbeddedResource Include="Html\css\images\iossplash.png" />
+ </ItemGroup>
+ <ItemGroup>
+ <EmbeddedResource Include="Html\updatePassword.html" />
+ </ItemGroup>
+ <ItemGroup>
+ <EmbeddedResource Include="Html\userImage.html" />
+ </ItemGroup>
+ <ItemGroup>
+ <EmbeddedResource Include="Html\scripts\IndexPage.js" />
+ </ItemGroup>
+ <ItemGroup>
+ <EmbeddedResource Include="Html\css\images\defaultCollectionImage.png" />
+ </ItemGroup>
+ <ItemGroup>
+ <EmbeddedResource Include="Html\css\images\toolsWhite.png" />
+ </ItemGroup>
+ <ItemGroup>
+ <EmbeddedResource Include="Html\css\images\currentUserDefaultWhite.png" />
+ </ItemGroup>
+ <ItemGroup>
+ <EmbeddedResource Include="Html\css\images\rightArrow.png" />
+ </ItemGroup>
+ <ItemGroup>
+ <EmbeddedResource Include="Html\css\images\userFlyoutDefault.png" />
+ </ItemGroup>
+ <ItemGroup>
+ <EmbeddedResource Include="Html\scripts\MediaLibraryPage.js" />
+ </ItemGroup>
+ <ItemGroup>
+ <EmbeddedResource Include="Html\scripts\DisplaySettingsPage.js" />
+ </ItemGroup>
+ <ItemGroup>
+ <EmbeddedResource Include="Html\scripts\PluginsPage.js" />
+ </ItemGroup>
+ <ItemGroup>
+ <EmbeddedResource Include="Html\scripts\MetadataConfigurationPage.js" />
+ </ItemGroup>
+ <ItemGroup>
+ <EmbeddedResource Include="Html\scripts\LoginPage.js" />
+ </ItemGroup>
+ <ItemGroup>
+ <EmbeddedResource Include="Html\scripts\UpdatePasswordPage.js" />
+ </ItemGroup>
+ <ItemGroup>
+ <EmbeddedResource Include="Html\scripts\AdvancedConfigurationPage.js" />
+ <EmbeddedResource Include="Html\scripts\EditUserPage.js" />
+ <EmbeddedResource Include="Html\scripts\UserImagePage.js" />
+ <EmbeddedResource Include="Html\scripts\UserProfilesPage.js" />
+ </ItemGroup>
+ <ItemGroup>
+ <EmbeddedResource Include="Html\advancedMetadata.html" />
+ </ItemGroup>
+ <ItemGroup>
+ <EmbeddedResource Include="Html\scripts\AdvancedMetadataConfigurationPage.js" />
+ </ItemGroup>
+ <ItemGroup>
+ <EmbeddedResource Include="Html\pluginUpdates.html" />
+ </ItemGroup>
+ <ItemGroup>
+ <EmbeddedResource Include="Html\scripts\PluginUpdatesPage.js" />
+ </ItemGroup>
+ <ItemGroup>
+ <EmbeddedResource Include="Html\addPlugin.html" />
+ <EmbeddedResource Include="Html\scripts\AddPluginPage.js" />
+ </ItemGroup>
+ <ItemGroup>
+ <EmbeddedResource Include="Html\css\images\bg.png" />
+ </ItemGroup>
+ <ItemGroup>
+ <EmbeddedResource Include="Html\pluginCatalog.html" />
+ <EmbeddedResource Include="Html\scripts\PluginCatalogPage.js" />
+ </ItemGroup>
+ <ItemGroup>
+ <EmbeddedResource Include="Html\css\images\leftArrowBlack.png" />
+ </ItemGroup>
+ <ItemGroup>
+ <EmbeddedResource Include="Html\css\images\leftArrowWhite.png" />
+ </ItemGroup>
+ <ItemGroup>
+ <EmbeddedResource Include="Html\css\images\currentUserDefaultBlack.png" />
+ <EmbeddedResource Include="Html\css\images\toolsBlack.png" />
+ </ItemGroup>
+ <ItemGroup>
+ <EmbeddedResource Include="Html\scheduledTasks.html" />
+ </ItemGroup>
+ <ItemGroup>
+ <EmbeddedResource Include="Html\scripts\ScheduledTasksPage.js" />
+ </ItemGroup>
+ <ItemGroup>
+ <EmbeddedResource Include="Html\scheduledTask.html" />
+ <EmbeddedResource Include="Html\scripts\ScheduledTaskPage.js" />
+ </ItemGroup>
+ <ItemGroup>
+ <EmbeddedResource Include="Html\wizardStart.html" />
+ </ItemGroup>
+ <ItemGroup>
+ <EmbeddedResource Include="Html\wizardFinish.html" />
+ </ItemGroup>
+ <ItemGroup>
+ <EmbeddedResource Include="Html\wizardUser.html" />
+ <EmbeddedResource Include="Html\wizardLibrary.html" />
+ </ItemGroup>
+ <ItemGroup>
+ <EmbeddedResource Include="Html\scripts\WizardStartPage.js" />
+ </ItemGroup>
+ <ItemGroup>
+ <EmbeddedResource Include="Html\scripts\WizardUserPage.js" />
+ </ItemGroup>
+ <ItemGroup>
+ <EmbeddedResource Include="Html\css\images\cloudNetwork.png" />
+ </ItemGroup>
+ <ItemGroup>
+ <EmbeddedResource Include="Html\css\images\movieFolder.png" />
+ </ItemGroup>
+ <ItemGroup>
+ <EmbeddedResource Include="Html\css\images\checkmarkblack.png" />
+ </ItemGroup>
+ <ItemGroup>
+ <EmbeddedResource Include="Html\log.html" />
+ </ItemGroup>
+ <ItemGroup>
+ <EmbeddedResource Include="Html\scripts\LogPage.js" />
+ </ItemGroup>
+ <ItemGroup>
+ <EmbeddedResource Include="Html\metadataImages.html" />
+ </ItemGroup>
+ <ItemGroup>
+ <EmbeddedResource Include="Html\scripts\MetadataImagesPage.js" />
+ </ItemGroup>
+ <ItemGroup>
+ <EmbeddedResource Include="Html\scripts\DashboardPage.js" />
+ </ItemGroup>
+ <ItemGroup>
+ <EmbeddedResource Include="Html\css\images\checkMarkGreen.png" />
+ </ItemGroup>
+ <ItemGroup>
+ <EmbeddedResource Include="Html\css\images\clients\html5.png" />
+ </ItemGroup>
+ <ItemGroup>
+ <EmbeddedResource Include="Html\css\images\clients\android.png" />
+ <EmbeddedResource Include="Html\css\images\clients\ios.png" />
+ </ItemGroup>
+ <ItemGroup>
+ <EmbeddedResource Include="Html\css\images\clients\mb.png" />
+ </ItemGroup>
+ <ItemGroup>
+ <EmbeddedResource Include="Html\css\images\clients\windowsrt.png" />
+ </ItemGroup>
+ <ItemGroup>
+ <EmbeddedResource Include="Html\css\images\clients\windowsphone.png" />
+ <EmbeddedResource Include="Html\css\images\clients\win8.png" />
+ </ItemGroup>
+ <ItemGroup>
+ <EmbeddedResource Include="Html\css\images\notifications\download.png" />
+ </ItemGroup>
+ <ItemGroup>
+ <EmbeddedResource Include="Html\scripts\Extensions.js" />
+ </ItemGroup>
+ <ItemGroup>
+ <EmbeddedResource Include="Html\support.html" />
+ </ItemGroup>
+ <ItemGroup>
+ <EmbeddedResource Include="Html\scripts\SupporterPage.js" />
+ </ItemGroup>
+ <ItemGroup>
+ <EmbeddedResource Include="Html\supporter.html" />
+ </ItemGroup>
+ <ItemGroup>
+ <EmbeddedResource Include="Html\css\images\suppbadge.png" />
+ </ItemGroup>
+ <ItemGroup>
+ <EmbeddedResource Include="Html\css\images\premiumflag.png" />
+ </ItemGroup>
+ <ItemGroup>
+ <EmbeddedResource Include="Html\supporterKey.html" />
+ </ItemGroup>
+ <ItemGroup>
+ <EmbeddedResource Include="Html\scripts\SupporterKeyPage.js" />
+ </ItemGroup>
+ <ItemGroup>
+ <EmbeddedResource Include="Html\css\images\donatepp.png" />
+ </ItemGroup>
+ <ItemGroup>
+ <EmbeddedResource Include="Html\thirdparty\jqm-icon-pack-3.0\font-awesome\faicons-v2.png" />
+ <EmbeddedResource Include="Html\thirdparty\jqm-icon-pack-3.0\font-awesome\faicons.png" />
+ <EmbeddedResource Include="Html\thirdparty\jqm-icon-pack-3.0\font-awesome\images\ajax-loader.png" />
+ <EmbeddedResource Include="Html\thirdparty\jqm-icon-pack-3.0\font-awesome\images\icons-18-black-pack.png" />
+ <EmbeddedResource Include="Html\thirdparty\jqm-icon-pack-3.0\font-awesome\images\icons-18-white-pack.png" />
+ <EmbeddedResource Include="Html\thirdparty\jqm-icon-pack-3.0\font-awesome\images\icons-36-black-pack.png" />
+ <EmbeddedResource Include="Html\thirdparty\jqm-icon-pack-3.0\font-awesome\images\icons-36-white-pack.png" />
+ <EmbeddedResource Include="Html\thirdparty\jqm-icon-pack-3.0\font-awesome\index.html" />
+ <EmbeddedResource Include="Html\thirdparty\jqm-icon-pack-3.0\font-awesome\jqm-icon-pack-3.0.0-fa.css" />
+ <EmbeddedResource Include="Html\thirdparty\jqm-icon-pack-3.0\original\images\ajax-loader.gif" />
+ <EmbeddedResource Include="Html\thirdparty\jqm-icon-pack-3.0\original\images\ajax-loader.png" />
+ <EmbeddedResource Include="Html\thirdparty\jqm-icon-pack-3.0\original\images\icons-18-black-pack.png" />
+ <EmbeddedResource Include="Html\thirdparty\jqm-icon-pack-3.0\original\images\icons-18-white-pack.png" />
+ <EmbeddedResource Include="Html\thirdparty\jqm-icon-pack-3.0\original\images\icons-36-black-pack.png" />
+ <EmbeddedResource Include="Html\thirdparty\jqm-icon-pack-3.0\original\images\icons-36-white-pack.png" />
+ <EmbeddedResource Include="Html\thirdparty\jqm-icon-pack-3.0\original\index.html" />
+ <EmbeddedResource Include="Html\thirdparty\jqm-icon-pack-3.0\original\jqm-icon-pack-2.0-original.css" />
+ </ItemGroup>
+ <ItemGroup>
+ <EmbeddedResource Include="Html\thirdparty\jqm-icon-pack-3.0\font-awesome\font\fontawesome-webfont.eot" />
+ <EmbeddedResource Include="Html\thirdparty\jqm-icon-pack-3.0\font-awesome\font\fontawesome-webfont.ttf" />
+ <EmbeddedResource Include="Html\thirdparty\jqm-icon-pack-3.0\font-awesome\font\fontawesome-webfont.woff" />
+ <EmbeddedResource Include="Html\thirdparty\jqm-icon-pack-3.0\font-awesome\font\FontAwesome.otf" />
+ <EmbeddedResource Include="Html\thirdparty\jqm-icon-pack-3.0\font-awesome\jqm-icon-pack-3.0.0-fa.scss" />
+ </ItemGroup>
+ <ItemGroup>
+ <EmbeddedResource Include="Html\css\images\registerpp.png" />
+ </ItemGroup>
+ <ItemGroup>
+ <EmbeddedResource Include="Html\css\images\home.png" />
+ </ItemGroup>
+ <ItemGroup>
+ <EmbeddedResource Include="Html\css\images\notifications\done.png" />
+ <EmbeddedResource Include="Html\css\images\notifications\error.png" />
+ </ItemGroup>
+ <ItemGroup>
+ <EmbeddedResource Include="Html\css\images\notifications\cancelled.png" />
+ </ItemGroup>
+ <ItemGroup>
+ <EmbeddedResource Include="Html\css\images\notifications\info.png" />
+ </ItemGroup>
+ <ItemGroup>
+ <EmbeddedResource Include="Html\itemDetails.html" />
+ </ItemGroup>
+ <ItemGroup>
+ <EmbeddedResource Include="Html\scripts\ItemDetailPage.js" />
+ </ItemGroup>
+ <ItemGroup>
+ <EmbeddedResource Include="Html\css\images\media\playCircle.png" />
+ <EmbeddedResource Include="Html\css\images\media\nextTrack.png" />
+ <EmbeddedResource Include="Html\css\images\media\pause.png" />
+ <EmbeddedResource Include="Html\css\images\media\play.png" />
+ <EmbeddedResource Include="Html\css\images\media\previousTrack.png" />
+ <EmbeddedResource Include="Html\css\images\media\stop.png" />
+ <EmbeddedResource Include="Html\css\images\itemDetails\videoDefault.png" />
+ <EmbeddedResource Include="Html\css\images\itemDetails\audioDefault.png" />
+ <EmbeddedResource Include="Html\css\images\itemDetails\gameDefault.png" />
+ <EmbeddedResource Include="Html\css\images\mblogoicon.png" />
+ <EmbeddedResource Include="Html\css\images\mblogotextblack.png" />
+ <EmbeddedResource Include="Html\css\images\mblogotextwhite.png" />
+ <Content Include="Html\css\images\stars.png" />
+ <EmbeddedResource Include="Html\scripts\MediaPlayer.js" />
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="packages.config" />
+ </ItemGroup>
+ <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
+ <PropertyGroup>
+ <PostBuildEvent>xcopy "$(TargetPath)" "$(SolutionDir)\MediaBrowser.ServerApplication\CorePlugins\" /y</PostBuildEvent>
+ </PropertyGroup>
+ <Import Project="$(SolutionDir)\.nuget\nuget.targets" />
+ <!-- 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/Nuget/MediaBrowser.ApiClient.nuspec b/Nuget/MediaBrowser.ApiClient.nuspec
new file mode 100644
index 000000000..4a0f00b0e
--- /dev/null
+++ b/Nuget/MediaBrowser.ApiClient.nuspec
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="utf-8"?>
+<package xmlns="http://schemas.microsoft.com/packaging/2012/06/nuspec.xsd">
+ <metadata>
+ <id>MediaBrowser.ApiClient</id>
+ <version>3.0.0.2-beta</version>
+ <title>MediaBrowser.ApiClient</title>
+ <authors>Media Browser Team</authors>
+ <owners>scottisafool,Luke</owners>
+ <requireLicenseAcceptance>false</requireLicenseAcceptance>
+ <description>ApiClient allows .NET clients to easily access the Media Browser 3 web API</description>
+ <copyright>Copyright © 2013</copyright>
+ <dependencies>
+ <group>
+ <dependency id="protobuf-net" version="2.0.0.621" />
+ </group>
+ <group targetFramework=".NETFramework4.5">
+ <dependency id="ServiceStack.Text" version="3.9.37" />
+ </group>
+ <group targetFramework=".NETPortable0.0-net45+sl4+wp71+win8">
+ <dependency id="Newtonsoft.Json" version="4.5.11" />
+ <dependency id="Microsoft.Bcl.Async" version="1.0.14-rc" />
+ <dependency id="Microsoft.Net.Http" version="2.1.3-beta" />
+ </group>
+ </dependencies>
+ </metadata>
+ <files>
+ <file src="dlls\MediaBrowser.ApiInteraction.dll" target="lib\net45\MediaBrowser.ApiInteraction.dll" />
+ <file src="dlls\MediaBrowser.ApiInteraction.Portable.dll" target="lib\portable-net45+sl4+wp71+win8\MediaBrowser.ApiInteraction.Portable.dll" />
+ </files>
+</package> \ No newline at end of file
diff --git a/Nuget/MediaBrowser.Common.nuspec b/Nuget/MediaBrowser.Common.nuspec
new file mode 100644
index 000000000..b6ca6ae02
--- /dev/null
+++ b/Nuget/MediaBrowser.Common.nuspec
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="utf-8"?>
+<package xmlns="http://schemas.microsoft.com/packaging/2010/07/nuspec.xsd">
+ <metadata>
+ <id>MediaBrowser.Common</id>
+ <version>1.0.1</version>
+ <title>MediaBrowser.Common</title>
+ <authors>Media Browser Team</authors>
+ <owners />
+ <projectUrl>https://github.com/MediaBrowser/MediaBrowser</projectUrl>
+ <requireLicenseAcceptance>false</requireLicenseAcceptance>
+ <description>Contains common model objects and interfaces used by all Media Browser solutions.</description>
+ </metadata>
+ <files>
+ <file src="dlls\MediaBrowser.Common.dll" target="lib\net45\MediaBrowser.Common.dll" />
+ <file src="dlls\MediaBrowser.Model.dll" target="lib\net45\MediaBrowser.Model.dll" />
+ <file src="dlls\MediaBrowser.Model.dll" target="lib\portable-net4+sl4+wp7+win8\MediaBrowser.Model.dll" />
+ </files>
+</package> \ No newline at end of file
diff --git a/Nuget/MediaBrowser.Server.Core.nupkg.REMOVED.git-id b/Nuget/MediaBrowser.Server.Core.nupkg.REMOVED.git-id
deleted file mode 100644
index a2490601e..000000000
--- a/Nuget/MediaBrowser.Server.Core.nupkg.REMOVED.git-id
+++ /dev/null
@@ -1 +0,0 @@
-da3d30d634468465d8995ba6cb1c0872959b3e9c \ No newline at end of file
diff --git a/Nuget/MediaBrowser.Server.Core.nuspec b/Nuget/MediaBrowser.Server.Core.nuspec
new file mode 100644
index 000000000..82fb2c531
--- /dev/null
+++ b/Nuget/MediaBrowser.Server.Core.nuspec
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="utf-8"?>
+<package xmlns="http://schemas.microsoft.com/packaging/2010/07/nuspec.xsd">
+ <metadata>
+ <id>MediaBrowser.Server.Core</id>
+ <version>1.0.0</version>
+ <title>Media Browser.Server.Core</title>
+ <authors>Media Browser Team</authors>
+ <owners />
+ <projectUrl>https://github.com/MediaBrowser/MediaBrowser</projectUrl>
+ <requireLicenseAcceptance>false</requireLicenseAcceptance>
+ <description>Contains core components required to build plugins for Media Browser Server.</description>
+ <dependencies>
+ <dependency id="MediaBrowser.Common" version="1.0.1" />
+ </dependencies>
+ </metadata>
+ <files>
+ <file src="dlls\MediaBrowser.Controller.dll" target="lib\net45\MediaBrowser.Controller.dll" />
+ </files>
+</package> \ No newline at end of file
diff --git a/Nuget/MediaBrowser.Theater.Core.nuspec b/Nuget/MediaBrowser.Theater.Core.nuspec
new file mode 100644
index 000000000..1456ced03
--- /dev/null
+++ b/Nuget/MediaBrowser.Theater.Core.nuspec
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8"?>
+<package xmlns="http://schemas.microsoft.com/packaging/2010/07/nuspec.xsd">
+ <metadata>
+ <id>MediaBrowser.Theater.Core</id>
+ <version>1.0.0</version>
+ <title>MediaBrowser.Theater.Core</title>
+ <authors>Media Browser Team</authors>
+ <owners />
+ <projectUrl>https://github.com/MediaBrowser/MediaBrowser.Theater</projectUrl>
+ <requireLicenseAcceptance>false</requireLicenseAcceptance>
+ <description>Contains components required to build plugins for Media Browser Theater.</description>
+ <dependencies>
+ <dependency id="MediaBrowser.Common" version="1.0.1" />
+ </dependencies>
+ </metadata>
+ <files>
+ <file src="dlls\MediaBrowser.UI.Controls.dll" target="lib\net45\MediaBrowser.UI.Controls.dll" />
+ <file src="dlls\MediaBrowser.UI.dll" target="lib\net45\MediaBrowser.UI.dll" />
+ </files>
+</package> \ No newline at end of file