diff --git a/MediaBrowser.Api/Images/ImageService.cs b/MediaBrowser.Api/Images/ImageService.cs
index 4f06ae4245..1c0e6c68da 100644
--- a/MediaBrowser.Api/Images/ImageService.cs
+++ b/MediaBrowser.Api/Images/ImageService.cs
@@ -268,7 +268,7 @@ namespace MediaBrowser.Api.Images
///
private object GetImage(ImageRequest request, BaseItem item)
{
- var kernel = (Kernel)Kernel;
+ var kernel = Kernel.Instance;
var index = request.Index ?? 0;
diff --git a/MediaBrowser.Api/Library/LibraryService.cs b/MediaBrowser.Api/Library/LibraryService.cs
index 11d8777111..b49cc568fe 100644
--- a/MediaBrowser.Api/Library/LibraryService.cs
+++ b/MediaBrowser.Api/Library/LibraryService.cs
@@ -1,4 +1,5 @@
-using MediaBrowser.Common.Implementations.HttpServer;
+using MediaBrowser.Common;
+using MediaBrowser.Common.Implementations.HttpServer;
using MediaBrowser.Common.Kernel;
using MediaBrowser.Controller;
using MediaBrowser.Controller.Entities;
diff --git a/MediaBrowser.Api/PackageService.cs b/MediaBrowser.Api/PackageService.cs
index a45b11e269..75dffc67b6 100644
--- a/MediaBrowser.Api/PackageService.cs
+++ b/MediaBrowser.Api/PackageService.cs
@@ -1,4 +1,5 @@
-using MediaBrowser.Common.Extensions;
+using MediaBrowser.Common;
+using MediaBrowser.Common.Extensions;
using MediaBrowser.Common.Implementations.HttpServer;
using MediaBrowser.Common.Kernel;
using MediaBrowser.Controller;
@@ -108,13 +109,11 @@ namespace MediaBrowser.Api
/// Unsupported PackageType
public object Get(GetPackageVersionUpdates request)
{
- var kernel = (Kernel)Kernel;
-
var result = new List();
if (request.PackageType == PackageType.UserInstalled || request.PackageType == PackageType.All)
{
- result.AddRange(kernel.InstallationManager.GetAvailablePluginUpdates(false, CancellationToken.None).Result.ToList());
+ result.AddRange(Kernel.Instance.InstallationManager.GetAvailablePluginUpdates(false, CancellationToken.None).Result.ToList());
}
else if (request.PackageType == PackageType.System || request.PackageType == PackageType.All)
@@ -137,9 +136,7 @@ namespace MediaBrowser.Api
/// System.Object.
public object Get(GetPackage request)
{
- var kernel = (Kernel)Kernel;
-
- var packages = kernel.InstallationManager.GetAvailablePackages(CancellationToken.None, applicationVersion: ApplicationHost.ApplicationVersion).Result;
+ var packages = Kernel.Instance.InstallationManager.GetAvailablePackages(CancellationToken.None, applicationVersion: ApplicationHost.ApplicationVersion).Result;
var result = packages.FirstOrDefault(p => p.name.Equals(request.Name, StringComparison.OrdinalIgnoreCase));
@@ -153,9 +150,7 @@ namespace MediaBrowser.Api
/// System.Object.
public object Get(GetPackages request)
{
- var kernel = (Kernel)Kernel;
-
- var packages = kernel.InstallationManager.GetAvailablePackages(CancellationToken.None, request.PackageType, ApplicationHost.ApplicationVersion).Result;
+ var packages = Kernel.Instance.InstallationManager.GetAvailablePackages(CancellationToken.None, request.PackageType, ApplicationHost.ApplicationVersion).Result;
return ToOptimizedResult(packages.ToList());
}
@@ -167,18 +162,16 @@ namespace MediaBrowser.Api
///
public void Post(InstallPackage request)
{
- var kernel = (Kernel)Kernel;
-
var package = string.IsNullOrEmpty(request.Version) ?
- kernel.InstallationManager.GetLatestCompatibleVersion(request.Name, request.UpdateClass).Result :
- kernel.InstallationManager.GetPackage(request.Name, request.UpdateClass, Version.Parse(request.Version)).Result;
+ Kernel.Instance.InstallationManager.GetLatestCompatibleVersion(request.Name, request.UpdateClass).Result :
+ Kernel.Instance.InstallationManager.GetPackage(request.Name, request.UpdateClass, Version.Parse(request.Version)).Result;
if (package == null)
{
throw new ResourceNotFoundException(string.Format("Package not found: {0}", request.Name));
}
- Task.Run(() => kernel.InstallationManager.InstallPackage(package, new Progress { }, CancellationToken.None));
+ Task.Run(() => Kernel.Instance.InstallationManager.InstallPackage(package, new Progress { }, CancellationToken.None));
}
///
@@ -187,9 +180,7 @@ namespace MediaBrowser.Api
/// The request.
public void Delete(CancelPackageInstallation request)
{
- var kernel = (Kernel)Kernel;
-
- var info = kernel.InstallationManager.CurrentInstallations.FirstOrDefault(i => i.Item1.Id == request.Id);
+ var info = Kernel.Instance.InstallationManager.CurrentInstallations.FirstOrDefault(i => i.Item1.Id == request.Id);
if (info != null)
{
diff --git a/MediaBrowser.Api/Playback/BaseStreamingService.cs b/MediaBrowser.Api/Playback/BaseStreamingService.cs
index 9808564105..5107d13c21 100644
--- a/MediaBrowser.Api/Playback/BaseStreamingService.cs
+++ b/MediaBrowser.Api/Playback/BaseStreamingService.cs
@@ -40,15 +40,12 @@ namespace MediaBrowser.Api.Playback
///
/// The library manager.
protected ILibraryManager LibraryManager { get; set; }
-
+
///
- /// Gets the server kernel.
+ /// Gets or sets the iso manager.
///
- /// The server kernel.
- protected Kernel ServerKernel
- {
- get { return Kernel as Kernel; }
- }
+ /// The iso manager.
+ protected IIsoManager IsoManager { get; set; }
///
/// Initializes a new instance of the class.
@@ -56,11 +53,13 @@ namespace MediaBrowser.Api.Playback
/// The app paths.
/// The user manager.
/// The library manager.
- protected BaseStreamingService(IServerApplicationPaths appPaths, IUserManager userManager, ILibraryManager libraryManager)
+ /// The iso manager.
+ protected BaseStreamingService(IServerApplicationPaths appPaths, IUserManager userManager, ILibraryManager libraryManager, IIsoManager isoManager)
{
ApplicationPaths = appPaths;
UserManager = userManager;
LibraryManager = libraryManager;
+ IsoManager = isoManager;
}
///
@@ -307,11 +306,11 @@ namespace MediaBrowser.Api.Playback
/// System.String.
private string GetExtractedAssPath(Video video, MediaStream subtitleStream)
{
- var path = ServerKernel.FFMpegManager.GetSubtitleCachePath(video, subtitleStream.Index, ".ass");
+ var path = Kernel.Instance.FFMpegManager.GetSubtitleCachePath(video, subtitleStream.Index, ".ass");
if (!File.Exists(path))
{
- var success = ServerKernel.FFMpegManager.ExtractTextSubtitle(video, subtitleStream.Index, path, CancellationToken.None).Result;
+ var success = Kernel.Instance.FFMpegManager.ExtractTextSubtitle(video, subtitleStream.Index, path, CancellationToken.None).Result;
if (!success)
{
@@ -330,11 +329,11 @@ namespace MediaBrowser.Api.Playback
/// System.String.
private string GetConvertedAssPath(Video video, MediaStream subtitleStream)
{
- var path = ServerKernel.FFMpegManager.GetSubtitleCachePath(video, subtitleStream.Index, ".ass");
+ var path = Kernel.Instance.FFMpegManager.GetSubtitleCachePath(video, subtitleStream.Index, ".ass");
if (!File.Exists(path))
{
- var success = ServerKernel.FFMpegManager.ConvertTextSubtitle(subtitleStream, path, CancellationToken.None).Result;
+ var success = Kernel.Instance.FFMpegManager.ConvertTextSubtitle(subtitleStream, path, CancellationToken.None).Result;
if (!success)
{
@@ -476,8 +475,8 @@ namespace MediaBrowser.Api.Playback
protected string GetInputArgument(BaseItem item, IIsoMount isoMount)
{
return isoMount == null ?
- ServerKernel.FFMpegManager.GetInputArgument(item) :
- ServerKernel.FFMpegManager.GetInputArgument(item as Video, isoMount);
+ Kernel.Instance.FFMpegManager.GetInputArgument(item) :
+ Kernel.Instance.FFMpegManager.GetInputArgument(item as Video, isoMount);
}
///
@@ -490,11 +489,10 @@ namespace MediaBrowser.Api.Playback
{
var video = state.Item 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 && IsoManager.CanMount(video.Path))
+ {
+ state.IsoMount = await IsoManager.Mount(video.Path, CancellationToken.None).ConfigureAwait(false);
+ }
var process = new Process
{
@@ -507,8 +505,8 @@ namespace MediaBrowser.Api.Playback
RedirectStandardOutput = true,
RedirectStandardError = true,
- FileName = ServerKernel.FFMpegManager.FFMpegPath,
- WorkingDirectory = Path.GetDirectoryName(ServerKernel.FFMpegManager.FFMpegPath),
+ FileName = Kernel.Instance.FFMpegManager.FFMpegPath,
+ WorkingDirectory = Path.GetDirectoryName(Kernel.Instance.FFMpegManager.FFMpegPath),
Arguments = GetCommandLineArguments(outputPath, state),
WindowStyle = ProcessWindowStyle.Hidden,
@@ -522,7 +520,7 @@ namespace MediaBrowser.Api.Playback
//Logger.Info(process.StartInfo.FileName + " " + process.StartInfo.Arguments);
- var logFilePath = Path.Combine(Kernel.ApplicationPaths.LogDirectoryPath, "ffmpeg-" + Guid.NewGuid() + ".txt");
+ var logFilePath = Path.Combine(ApplicationPaths.LogDirectoryPath, "ffmpeg-" + Guid.NewGuid() + ".txt");
// FFMpeg writes debug/error info to stderr. This is useful when debugging so let's put it in the log directory.
state.LogFileStream = new FileStream(logFilePath, FileMode.Create, FileAccess.Write, FileShare.Read, StreamDefaults.DefaultFileStreamBufferSize, FileOptions.Asynchronous);
diff --git a/MediaBrowser.Api/Playback/Hls/AudioHlsService.cs b/MediaBrowser.Api/Playback/Hls/AudioHlsService.cs
index 0735f3b623..a98f274998 100644
--- a/MediaBrowser.Api/Playback/Hls/AudioHlsService.cs
+++ b/MediaBrowser.Api/Playback/Hls/AudioHlsService.cs
@@ -1,4 +1,5 @@
-using MediaBrowser.Controller;
+using MediaBrowser.Common.IO;
+using MediaBrowser.Controller;
using MediaBrowser.Controller.Library;
using MediaBrowser.Model.Dto;
using System;
@@ -10,13 +11,8 @@ namespace MediaBrowser.Api.Playback.Hls
///
public class AudioHlsService : BaseHlsService
{
- ///
- /// Initializes a new instance of the class.
- ///
- /// The app paths.
- /// The user manager.
- public AudioHlsService(IServerApplicationPaths appPaths, IUserManager userManager, ILibraryManager libraryManager)
- : base(appPaths, userManager, libraryManager)
+ public AudioHlsService(IServerApplicationPaths appPaths, IUserManager userManager, ILibraryManager libraryManager, IIsoManager isoManager)
+ : base(appPaths, userManager, libraryManager, isoManager)
{
}
diff --git a/MediaBrowser.Api/Playback/Hls/BaseHlsService.cs b/MediaBrowser.Api/Playback/Hls/BaseHlsService.cs
index d616565ca8..f73109dd00 100644
--- a/MediaBrowser.Api/Playback/Hls/BaseHlsService.cs
+++ b/MediaBrowser.Api/Playback/Hls/BaseHlsService.cs
@@ -17,8 +17,8 @@ namespace MediaBrowser.Api.Playback.Hls
///
public const string SegmentFilePrefix = "segment-";
- protected BaseHlsService(IServerApplicationPaths appPaths, IUserManager userManager, ILibraryManager libraryManager)
- : base(appPaths, userManager, libraryManager)
+ protected BaseHlsService(IServerApplicationPaths appPaths, IUserManager userManager, ILibraryManager libraryManager, IIsoManager isoManager)
+ : base(appPaths, userManager, libraryManager, isoManager)
{
}
@@ -174,9 +174,7 @@ namespace MediaBrowser.Api.Playback.Hls
segmentOutputPath = Path.Combine(segmentOutputPath, segmentOutputName + "%03d." + GetSegmentFileExtension(state).TrimStart('.'));
- var kernel = (Kernel)Kernel;
-
- var probeSize = kernel.FFMpegManager.GetProbeSizeArgument(state.Item);
+ var probeSize = Kernel.Instance.FFMpegManager.GetProbeSizeArgument(state.Item);
return string.Format("{0} {1} -i {2}{3} -threads 0 {4} {5} {6} -f ssegment -segment_list_flags +live -segment_time 9 -segment_list \"{7}\" \"{8}\"",
probeSize,
diff --git a/MediaBrowser.Api/Playback/Hls/VideoHlsService.cs b/MediaBrowser.Api/Playback/Hls/VideoHlsService.cs
index 41d818ce77..7fcd4357be 100644
--- a/MediaBrowser.Api/Playback/Hls/VideoHlsService.cs
+++ b/MediaBrowser.Api/Playback/Hls/VideoHlsService.cs
@@ -1,4 +1,5 @@
-using MediaBrowser.Controller;
+using MediaBrowser.Common.IO;
+using MediaBrowser.Controller;
using MediaBrowser.Controller.Library;
using System;
@@ -6,13 +7,8 @@ namespace MediaBrowser.Api.Playback.Hls
{
public class VideoHlsService : BaseHlsService
{
- ///
- /// Initializes a new instance of the class.
- ///
- /// The app paths.
- /// The user manager.
- public VideoHlsService(IServerApplicationPaths appPaths, IUserManager userManager, ILibraryManager libraryManager)
- : base(appPaths, userManager, libraryManager)
+ public VideoHlsService(IServerApplicationPaths appPaths, IUserManager userManager, ILibraryManager libraryManager, IIsoManager isoManager)
+ : base(appPaths, userManager, libraryManager, isoManager)
{
}
diff --git a/MediaBrowser.Api/Playback/Progressive/AudioService.cs b/MediaBrowser.Api/Playback/Progressive/AudioService.cs
index e81f0ac0df..86d9931524 100644
--- a/MediaBrowser.Api/Playback/Progressive/AudioService.cs
+++ b/MediaBrowser.Api/Playback/Progressive/AudioService.cs
@@ -1,4 +1,5 @@
-using MediaBrowser.Controller;
+using MediaBrowser.Common.IO;
+using MediaBrowser.Controller;
using MediaBrowser.Controller.Library;
using ServiceStack.ServiceHost;
using System.Collections.Generic;
@@ -24,12 +25,8 @@ namespace MediaBrowser.Api.Playback.Progressive
///
public class AudioService : BaseProgressiveStreamingService
{
- ///
- /// Initializes a new instance of the class.
- ///
- /// The app paths.
- public AudioService(IServerApplicationPaths appPaths, IUserManager userManager, ILibraryManager libraryManager)
- : base(appPaths, userManager, libraryManager)
+ public AudioService(IServerApplicationPaths appPaths, IUserManager userManager, ILibraryManager libraryManager, IIsoManager isoManager)
+ : base(appPaths, userManager, libraryManager, isoManager)
{
}
diff --git a/MediaBrowser.Api/Playback/Progressive/BaseProgressiveStreamingService.cs b/MediaBrowser.Api/Playback/Progressive/BaseProgressiveStreamingService.cs
index bbfe65504b..eba8decf2f 100644
--- a/MediaBrowser.Api/Playback/Progressive/BaseProgressiveStreamingService.cs
+++ b/MediaBrowser.Api/Playback/Progressive/BaseProgressiveStreamingService.cs
@@ -1,4 +1,5 @@
-using MediaBrowser.Common.Net;
+using MediaBrowser.Common.IO;
+using MediaBrowser.Common.Net;
using MediaBrowser.Controller;
using MediaBrowser.Controller.Entities;
using MediaBrowser.Controller.Entities.Audio;
@@ -14,12 +15,8 @@ namespace MediaBrowser.Api.Playback.Progressive
///
public abstract class BaseProgressiveStreamingService : BaseStreamingService
{
- ///
- /// Initializes a new instance of the class.
- ///
- /// The app paths.
- protected BaseProgressiveStreamingService(IServerApplicationPaths appPaths, IUserManager userManager, ILibraryManager libraryManager)
- : base(appPaths, userManager, libraryManager)
+ protected BaseProgressiveStreamingService(IServerApplicationPaths appPaths, IUserManager userManager, ILibraryManager libraryManager, IIsoManager isoManager) :
+ base(appPaths, userManager, libraryManager, isoManager)
{
}
diff --git a/MediaBrowser.Api/Playback/Progressive/VideoService.cs b/MediaBrowser.Api/Playback/Progressive/VideoService.cs
index 6261d32ee7..22f3320caf 100644
--- a/MediaBrowser.Api/Playback/Progressive/VideoService.cs
+++ b/MediaBrowser.Api/Playback/Progressive/VideoService.cs
@@ -1,4 +1,5 @@
-using MediaBrowser.Controller;
+using MediaBrowser.Common.IO;
+using MediaBrowser.Controller;
using MediaBrowser.Controller.Entities;
using System;
using MediaBrowser.Controller.Library;
@@ -30,12 +31,8 @@ namespace MediaBrowser.Api.Playback.Progressive
///
public class VideoService : BaseProgressiveStreamingService
{
- ///
- /// Initializes a new instance of the class.
- ///
- /// The app paths.
- public VideoService(IServerApplicationPaths appPaths, IUserManager userManager, ILibraryManager libraryManager)
- : base(appPaths, userManager, libraryManager)
+ public VideoService(IServerApplicationPaths appPaths, IUserManager userManager, ILibraryManager libraryManager, IIsoManager isoManager)
+ : base(appPaths, userManager, libraryManager, isoManager)
{
}
@@ -59,7 +56,7 @@ namespace MediaBrowser.Api.Playback.Progressive
{
var video = (Video)state.Item;
- var probeSize = ServerKernel.FFMpegManager.GetProbeSizeArgument(video.VideoType, video.IsoType);
+ var probeSize = Kernel.Instance.FFMpegManager.GetProbeSizeArgument(video.VideoType, video.IsoType);
// Get the output codec name
var videoCodec = GetVideoCodec(state.Request);
diff --git a/MediaBrowser.Api/Plugin.cs b/MediaBrowser.Api/Plugin.cs
index b8c81bbe12..321267b041 100644
--- a/MediaBrowser.Api/Plugin.cs
+++ b/MediaBrowser.Api/Plugin.cs
@@ -1,4 +1,5 @@
-using MediaBrowser.Common.Kernel;
+using MediaBrowser.Common.Configuration;
+using MediaBrowser.Common.Kernel;
using MediaBrowser.Common.Plugins;
using MediaBrowser.Model.Plugins;
using MediaBrowser.Model.Serialization;
@@ -13,9 +14,10 @@ namespace MediaBrowser.Api
///
/// Initializes a new instance of the class.
///
- /// The kernel.
+ /// The app paths.
/// The XML serializer.
- public Plugin(IKernel kernel, IXmlSerializer xmlSerializer) : base(kernel, xmlSerializer)
+ public Plugin(IApplicationPaths appPaths, IXmlSerializer xmlSerializer)
+ : base(appPaths, xmlSerializer)
{
Instance = this;
}
diff --git a/MediaBrowser.Api/PluginService.cs b/MediaBrowser.Api/PluginService.cs
index 7e907c2dd2..932a3e5454 100644
--- a/MediaBrowser.Api/PluginService.cs
+++ b/MediaBrowser.Api/PluginService.cs
@@ -1,6 +1,7 @@
-using MediaBrowser.Common.Extensions;
+using MediaBrowser.Common;
+using MediaBrowser.Common.Extensions;
using MediaBrowser.Common.Implementations.HttpServer;
-using MediaBrowser.Common.Kernel;
+using MediaBrowser.Common.Security;
using MediaBrowser.Controller;
using MediaBrowser.Model.Entities;
using MediaBrowser.Model.Plugins;
@@ -129,13 +130,16 @@ namespace MediaBrowser.Api
///
private readonly IApplicationHost _appHost;
+ private readonly ISecurityManager _securityManager;
+
///
/// Initializes a new instance of the class.
///
/// The json serializer.
/// The app host.
+ /// The security manager.
/// jsonSerializer
- public PluginService(IJsonSerializer jsonSerializer, IApplicationHost appHost)
+ public PluginService(IJsonSerializer jsonSerializer, IApplicationHost appHost, ISecurityManager securityManager)
: base()
{
if (jsonSerializer == null)
@@ -144,6 +148,7 @@ namespace MediaBrowser.Api
}
_appHost = appHost;
+ _securityManager = securityManager;
_jsonSerializer = jsonSerializer;
}
@@ -206,13 +211,11 @@ namespace MediaBrowser.Api
/// System.Object.
public object Get(GetPluginSecurityInfo request)
{
- var kernel = (Kernel)Kernel;
-
var result = new PluginSecurityInfo
{
- IsMBSupporter = kernel.SecurityManager.IsMBSupporter,
- SupporterKey = kernel.SecurityManager.SupporterKey,
- LegacyKey = kernel.SecurityManager.LegacyKey
+ IsMBSupporter = _securityManager.IsMBSupporter,
+ SupporterKey = _securityManager.SupporterKey,
+ LegacyKey = _securityManager.LegacyKey
};
return ToOptimizedResult(result);
@@ -224,12 +227,10 @@ namespace MediaBrowser.Api
/// The request.
public void Post(UpdatePluginSecurityInfo request)
{
- var kernel = (Kernel)Kernel;
-
var info = _jsonSerializer.DeserializeFromStream(request.RequestStream);
- kernel.SecurityManager.SupporterKey = info.SupporterKey;
- kernel.SecurityManager.LegacyKey = info.LegacyKey;
+ _securityManager.SupporterKey = info.SupporterKey;
+ _securityManager.LegacyKey = info.LegacyKey;
}
///
@@ -256,11 +257,9 @@ namespace MediaBrowser.Api
/// The request.
public void Delete(UninstallPlugin request)
{
- var kernel = (Kernel)Kernel;
-
var plugin = _appHost.Plugins.First(p => p.Id == request.Id);
- kernel.InstallationManager.UninstallPlugin(plugin);
+ Kernel.Instance.InstallationManager.UninstallPlugin(plugin);
}
}
}
diff --git a/MediaBrowser.Api/SystemService.cs b/MediaBrowser.Api/SystemService.cs
index 7edaed1c72..0d5d47e4b7 100644
--- a/MediaBrowser.Api/SystemService.cs
+++ b/MediaBrowser.Api/SystemService.cs
@@ -1,7 +1,8 @@
-using MediaBrowser.Common.Extensions;
+using MediaBrowser.Common;
+using MediaBrowser.Common.Extensions;
using MediaBrowser.Common.Implementations.HttpServer;
-using MediaBrowser.Common.Kernel;
using MediaBrowser.Controller;
+using MediaBrowser.Controller.Configuration;
using MediaBrowser.Model.Configuration;
using MediaBrowser.Model.Serialization;
using MediaBrowser.Model.System;
@@ -72,13 +73,19 @@ namespace MediaBrowser.Api
///
private readonly IApplicationHost _appHost;
+ ///
+ /// The _configuration manager
+ ///
+ private readonly IServerConfigurationManager _configurationManager;
+
///
/// Initializes a new instance of the class.
///
/// The json serializer.
/// The app host.
+ /// The configuration manager.
/// jsonSerializer
- public SystemService(IJsonSerializer jsonSerializer, IApplicationHost appHost)
+ public SystemService(IJsonSerializer jsonSerializer, IApplicationHost appHost, IServerConfigurationManager configurationManager)
: base()
{
if (jsonSerializer == null)
@@ -91,6 +98,7 @@ namespace MediaBrowser.Api
}
_appHost = appHost;
+ _configurationManager = configurationManager;
_jsonSerializer = jsonSerializer;
}
@@ -101,7 +109,7 @@ namespace MediaBrowser.Api
/// System.Object.
public object Get(GetSystemInfo request)
{
- var result = Kernel.GetSystemInfo();
+ var result = Kernel.Instance.GetSystemInfo();
return ToOptimizedResult(result);
}
@@ -113,13 +121,11 @@ namespace MediaBrowser.Api
/// System.Object.
public object Get(GetConfiguration request)
{
- var kernel = (Kernel)Kernel;
+ var dateModified = File.GetLastWriteTimeUtc(_configurationManager.ApplicationPaths.SystemConfigurationFilePath);
- var dateModified = File.GetLastWriteTimeUtc(Kernel.ApplicationPaths.SystemConfigurationFilePath);
+ var cacheKey = (_configurationManager.ApplicationPaths.SystemConfigurationFilePath + dateModified.Ticks).GetMD5();
- var cacheKey = (Kernel.ApplicationPaths.SystemConfigurationFilePath + dateModified.Ticks).GetMD5();
-
- return ToOptimizedResultUsingCache(cacheKey, dateModified, null, () => kernel.Configuration);
+ return ToOptimizedResultUsingCache(cacheKey, dateModified, null, () => _configurationManager.Configuration);
}
///
@@ -131,7 +137,7 @@ namespace MediaBrowser.Api
Task.Run(async () =>
{
await Task.Delay(100);
- Kernel.PerformPendingRestart();
+ Kernel.Instance.PerformPendingRestart();
});
}
@@ -156,9 +162,7 @@ namespace MediaBrowser.Api
{
var serverConfig = _jsonSerializer.DeserializeFromStream(request.RequestStream);
- var kernel = (Kernel)Kernel;
-
- kernel.UpdateConfiguration(serverConfig);
+ _configurationManager.ReplaceConfiguration(serverConfig);
}
}
}
diff --git a/MediaBrowser.Api/UserService.cs b/MediaBrowser.Api/UserService.cs
index 7302420633..d4442ff448 100644
--- a/MediaBrowser.Api/UserService.cs
+++ b/MediaBrowser.Api/UserService.cs
@@ -181,8 +181,6 @@ namespace MediaBrowser.Api
/// System.Object.
public object Get(GetUsers request)
{
- var kernel = (Kernel)Kernel;
-
var dtoBuilder = new DtoBuilder(Logger);
var result = _userManager.Users.OrderBy(u => u.Name).Select(dtoBuilder.GetDtoUser).ToList();
@@ -312,8 +310,6 @@ namespace MediaBrowser.Api
/// System.Object.
public object Post(CreateUser request)
{
- var kernel = (Kernel)Kernel;
-
var dtoUser = _jsonSerializer.DeserializeFromStream(request.RequestStream);
var newUser = _userManager.CreateUser(dtoUser.Name).Result;
diff --git a/MediaBrowser.Api/WeatherService.cs b/MediaBrowser.Api/WeatherService.cs
index 930daa2703..7c85d849d7 100644
--- a/MediaBrowser.Api/WeatherService.cs
+++ b/MediaBrowser.Api/WeatherService.cs
@@ -32,11 +32,7 @@ namespace MediaBrowser.Api
/// System.Object.
public object Get(GetWeather request)
{
- var kernel = (Kernel) Kernel;
-
- var location = string.IsNullOrWhiteSpace(request.Location) ? kernel.Configuration.WeatherLocation : request.Location;
-
- var result = kernel.WeatherProviders.First().GetWeatherInfoAsync(location, CancellationToken.None).Result;
+ var result = Kernel.Instance.WeatherProviders.First().GetWeatherInfoAsync(request.Location, CancellationToken.None).Result;
return ToOptimizedResult(result);
}
diff --git a/MediaBrowser.Common.Implementations/BaseApplicationHost.cs b/MediaBrowser.Common.Implementations/BaseApplicationHost.cs
index 4e1b4634ec..b25c1808d0 100644
--- a/MediaBrowser.Common.Implementations/BaseApplicationHost.cs
+++ b/MediaBrowser.Common.Implementations/BaseApplicationHost.cs
@@ -1,4 +1,9 @@
-using System.Threading.Tasks;
+using MediaBrowser.Common.Configuration;
+using MediaBrowser.Common.Implementations.Logging;
+using MediaBrowser.Common.Implementations.NetworkManagement;
+using MediaBrowser.Common.Implementations.ScheduledTasks;
+using MediaBrowser.Common.Implementations.Security;
+using MediaBrowser.Common.Implementations.Serialization;
using MediaBrowser.Common.Implementations.Udp;
using MediaBrowser.Common.Implementations.Updates;
using MediaBrowser.Common.Implementations.WebSocket;
@@ -6,9 +11,11 @@ using MediaBrowser.Common.Kernel;
using MediaBrowser.Common.Net;
using MediaBrowser.Common.Plugins;
using MediaBrowser.Common.ScheduledTasks;
+using MediaBrowser.Common.Security;
using MediaBrowser.Common.Updates;
using MediaBrowser.Model.Logging;
using MediaBrowser.Model.Serialization;
+using MediaBrowser.Model.Updates;
using SimpleInjector;
using System;
using System.Collections.Generic;
@@ -16,16 +23,18 @@ using System.IO;
using System.Linq;
using System.Reflection;
using System.Threading;
+using System.Threading.Tasks;
namespace MediaBrowser.Common.Implementations
{
- public abstract class BaseApplicationHost
+ public abstract class BaseApplicationHost : IApplicationHost
+ where TApplicationPathsType : class, IApplicationPaths, new()
{
///
/// Gets or sets the logger.
///
/// The logger.
- public ILogger Logger { get; protected set; }
+ protected ILogger Logger { get; private set; }
///
/// Gets or sets the plugins.
@@ -43,13 +52,23 @@ namespace MediaBrowser.Common.Implementations
/// Gets the application paths.
///
/// The application paths.
- protected IApplicationPaths ApplicationPaths { get; private set; }
+ protected TApplicationPathsType ApplicationPaths = new TApplicationPathsType();
///
/// The container
///
protected readonly Container Container = new Container();
+ ///
+ /// The json serializer
+ ///
+ protected readonly IJsonSerializer JsonSerializer = new JsonSerializer();
+
+ ///
+ /// The _XML serializer
+ ///
+ protected readonly IXmlSerializer XmlSerializer = new XmlSerializer();
+
///
/// Gets assemblies that failed to load
///
@@ -109,12 +128,26 @@ namespace MediaBrowser.Common.Implementations
}
}
+ ///
+ /// Gets the kernel.
+ ///
+ /// The kernel.
+ protected IKernel Kernel { get; private set; }
+ protected ITaskManager TaskManager { get; private set; }
+ protected ISecurityManager SecurityManager { get; private set; }
+
+ protected IConfigurationManager ConfigurationManager { get; private set; }
+
///
/// Initializes a new instance of the class.
///
protected BaseApplicationHost()
{
FailedAssemblies = new List();
+
+ LogManager = new NlogManager(ApplicationPaths.LogDirectoryPath, LogFilePrefixName);
+
+ ConfigurationManager = GetConfigurationManager();
}
///
@@ -125,15 +158,25 @@ namespace MediaBrowser.Common.Implementations
{
return Task.Run(() =>
{
- ApplicationPaths = GetApplicationPaths();
-
- LogManager = GetLogManager();
-
Logger = LogManager.GetLogger("App");
IsFirstRun = !File.Exists(ApplicationPaths.SystemConfigurationFilePath);
DiscoverTypes();
+
+ LogManager.ReloadLogger(ConfigurationManager.CommonConfiguration.EnableDebugLevelLogging ? LogSeverity.Debug : LogSeverity.Info);
+
+ Logger.Info("Version {0} initializing", ApplicationVersion);
+
+ Kernel = GetKernel();
+
+ RegisterResources();
+
+ FindParts();
+
+ Task.Run(() => ConfigureAutoRunAtStartup());
+
+ Kernel.Init();
});
}
@@ -144,16 +187,13 @@ namespace MediaBrowser.Common.Implementations
protected abstract IEnumerable GetComposablePartAssemblies();
///
- /// Gets the log manager.
+ /// Gets the name of the log file prefix.
///
- /// ILogManager.
- protected abstract ILogManager GetLogManager();
+ /// The name of the log file prefix.
+ protected abstract string LogFilePrefixName { get; }
- ///
- /// Gets the application paths.
- ///
- /// IApplicationPaths.
- protected abstract IApplicationPaths GetApplicationPaths();
+ protected abstract IKernel GetKernel();
+ protected abstract IConfigurationManager GetConfigurationManager();
///
/// Finds the parts.
@@ -184,21 +224,44 @@ namespace MediaBrowser.Common.Implementations
///
/// Registers resources that classes will depend on
///
- protected virtual void RegisterResources(ITaskManager taskManager, INetworkManager networkManager, IServerManager serverManager)
+ protected virtual void RegisterResources()
{
+ RegisterSingleInstance(ConfigurationManager);
+ RegisterSingleInstance(this);
+
+ RegisterSingleInstance(ApplicationPaths);
+
+ var networkManager = new NetworkManager();
+
+ var serverManager = new ServerManager.ServerManager(this, Kernel, networkManager, JsonSerializer, Logger, ConfigurationManager);
+
+ TaskManager = new TaskManager(ApplicationPaths, JsonSerializer, Logger, serverManager);
+
+ RegisterSingleInstance(JsonSerializer);
+ RegisterSingleInstance(XmlSerializer);
+
RegisterSingleInstance(LogManager);
RegisterSingleInstance(Logger);
- RegisterSingleInstance(ApplicationPaths);
- RegisterSingleInstance(taskManager);
+ RegisterSingleInstance(Kernel);
+
+ RegisterSingleInstance(TaskManager);
RegisterSingleInstance(() => new AlchemyServer(Logger));
RegisterSingleInstance(ProtobufSerializer);
RegisterSingleInstance(new UdpServer(Logger), false);
- RegisterSingleInstance(new PackageManager());
- RegisterSingleInstance(new HttpClientManager.HttpClientManager(ApplicationPaths, Logger));
- RegisterSingleInstance(networkManager);
- RegisterSingleInstance(serverManager);
+ var httpClient = new HttpClientManager.HttpClientManager(ApplicationPaths, Logger);
+
+ RegisterSingleInstance(httpClient);
+
+ RegisterSingleInstance(networkManager);
+ RegisterSingleInstance(serverManager);
+
+ SecurityManager = new PluginSecurityManager(Kernel, httpClient, JsonSerializer, ApplicationPaths);
+
+ RegisterSingleInstance(SecurityManager);
+
+ RegisterSingleInstance(new PackageManager(SecurityManager, networkManager, httpClient, ApplicationPaths, JsonSerializer, Logger));
}
///
@@ -336,7 +399,7 @@ namespace MediaBrowser.Common.Implementations
Logger.Info("Composing instances of " + currentType.Name);
- var parts = AllConcreteTypes.Where(currentType.IsAssignableFrom).Select(CreateInstance).Cast().ToArray();
+ var parts = AllConcreteTypes.AsParallel().Where(currentType.IsAssignableFrom).Select(CreateInstance).Cast().ToArray();
if (manageLiftime)
{
@@ -361,10 +424,8 @@ namespace MediaBrowser.Common.Implementations
///
/// Configures the auto run at startup.
///
- /// if set to true [autorun].
- public void ConfigureAutoRunAtStartup(bool autorun)
+ private void ConfigureAutoRunAtStartup()
{
-
}
///
@@ -409,5 +470,15 @@ namespace MediaBrowser.Common.Implementations
}
}
}
+
+ public abstract void Restart();
+
+ public abstract bool CanSelfUpdate { get; }
+
+ public abstract Task CheckForApplicationUpdate(CancellationToken cancellationToken, IProgress progress);
+
+ public abstract Task UpdateApplication(PackageVersionInfo package, CancellationToken cancellationToken, IProgress progress);
+
+ public abstract void Shutdown();
}
}
diff --git a/MediaBrowser.Common.Implementations/BaseApplicationPaths.cs b/MediaBrowser.Common.Implementations/BaseApplicationPaths.cs
index 37bd622004..d169336162 100644
--- a/MediaBrowser.Common.Implementations/BaseApplicationPaths.cs
+++ b/MediaBrowser.Common.Implementations/BaseApplicationPaths.cs
@@ -1,4 +1,5 @@
-using MediaBrowser.Common.Kernel;
+using MediaBrowser.Common.Configuration;
+using MediaBrowser.Common.Kernel;
using System;
using System.Configuration;
using System.IO;
diff --git a/MediaBrowser.Common.Implementations/Configuration/BaseConfigurationManager.cs b/MediaBrowser.Common.Implementations/Configuration/BaseConfigurationManager.cs
new file mode 100644
index 0000000000..2f50f5f7aa
--- /dev/null
+++ b/MediaBrowser.Common.Implementations/Configuration/BaseConfigurationManager.cs
@@ -0,0 +1,123 @@
+using MediaBrowser.Common.Configuration;
+using MediaBrowser.Common.Events;
+using MediaBrowser.Model.Configuration;
+using MediaBrowser.Model.Logging;
+using MediaBrowser.Model.Serialization;
+using System;
+using System.Threading;
+
+namespace MediaBrowser.Common.Implementations.Configuration
+{
+ ///
+ /// Class BaseConfigurationManager
+ ///
+ public abstract class BaseConfigurationManager : IConfigurationManager
+ {
+ ///
+ /// Gets the type of the configuration.
+ ///
+ /// The type of the configuration.
+ protected abstract Type ConfigurationType { get; }
+
+ ///
+ /// Occurs when [configuration updated].
+ ///
+ public event EventHandler ConfigurationUpdated;
+
+ ///
+ /// Gets the logger.
+ ///
+ /// The logger.
+ protected ILogger Logger { get; private set; }
+ ///
+ /// Gets the XML serializer.
+ ///
+ /// The XML serializer.
+ protected IXmlSerializer XmlSerializer { get; private set; }
+
+ ///
+ /// Gets or sets the application paths.
+ ///
+ /// The application paths.
+ public IApplicationPaths CommonApplicationPaths { get; private set; }
+
+ ///
+ /// The _configuration loaded
+ ///
+ private bool _configurationLoaded;
+ ///
+ /// The _configuration sync lock
+ ///
+ private object _configurationSyncLock = new object();
+ ///
+ /// The _configuration
+ ///
+ private BaseApplicationConfiguration _configuration;
+ ///
+ /// Gets the system configuration
+ ///
+ /// The configuration.
+ public BaseApplicationConfiguration CommonConfiguration
+ {
+ get
+ {
+ // Lazy load
+ LazyInitializer.EnsureInitialized(ref _configuration, ref _configurationLoaded, ref _configurationSyncLock, () => (BaseApplicationConfiguration)ConfigurationHelper.GetXmlConfiguration(ConfigurationType, CommonApplicationPaths.SystemConfigurationFilePath, XmlSerializer));
+ return _configuration;
+ }
+ protected set
+ {
+ _configuration = value;
+
+ _configurationLoaded = value != null;
+ }
+ }
+
+ ///
+ /// Initializes a new instance of the class.
+ ///
+ /// The application paths.
+ /// The log manager.
+ /// The XML serializer.
+ protected BaseConfigurationManager(IApplicationPaths applicationPaths, ILogManager logManager, IXmlSerializer xmlSerializer)
+ {
+ CommonApplicationPaths = applicationPaths;
+ XmlSerializer = xmlSerializer;
+ Logger = logManager.GetLogger(GetType().Name);
+ }
+
+ ///
+ /// The _save lock
+ ///
+ private readonly object _configurationSaveLock = new object();
+
+ ///
+ /// Saves the configuration.
+ ///
+ public void SaveConfiguration()
+ {
+ lock (_configurationSaveLock)
+ {
+ XmlSerializer.SerializeToFile(CommonConfiguration, CommonApplicationPaths.SystemConfigurationFilePath);
+ }
+
+ EventHelper.QueueEventIfNotNull(ConfigurationUpdated, this, EventArgs.Empty, Logger);
+ }
+
+ ///
+ /// Replaces the configuration.
+ ///
+ /// The new configuration.
+ /// newConfiguration
+ public void ReplaceConfiguration(BaseApplicationConfiguration newConfiguration)
+ {
+ if (newConfiguration == null)
+ {
+ throw new ArgumentNullException("newConfiguration");
+ }
+
+ CommonConfiguration = newConfiguration;
+ SaveConfiguration();
+ }
+ }
+}
diff --git a/MediaBrowser.Common.Implementations/HttpClientManager/HttpClientManager.cs b/MediaBrowser.Common.Implementations/HttpClientManager/HttpClientManager.cs
index e01718f45d..f9363e0d90 100644
--- a/MediaBrowser.Common.Implementations/HttpClientManager/HttpClientManager.cs
+++ b/MediaBrowser.Common.Implementations/HttpClientManager/HttpClientManager.cs
@@ -1,4 +1,5 @@
-using MediaBrowser.Common.IO;
+using MediaBrowser.Common.Configuration;
+using MediaBrowser.Common.IO;
using MediaBrowser.Common.Kernel;
using MediaBrowser.Common.Net;
using MediaBrowser.Model.Logging;
diff --git a/MediaBrowser.Common.Implementations/HttpServer/BaseRestService.cs b/MediaBrowser.Common.Implementations/HttpServer/BaseRestService.cs
index bf487b7603..382183b580 100644
--- a/MediaBrowser.Common.Implementations/HttpServer/BaseRestService.cs
+++ b/MediaBrowser.Common.Implementations/HttpServer/BaseRestService.cs
@@ -1,7 +1,5 @@
-using System.Collections.Generic;
-using MediaBrowser.Common.Extensions;
+using MediaBrowser.Common.Extensions;
using MediaBrowser.Common.IO;
-using MediaBrowser.Common.Kernel;
using MediaBrowser.Common.Net;
using MediaBrowser.Model.Logging;
using ServiceStack.Common;
@@ -9,6 +7,7 @@ using ServiceStack.Common.Web;
using ServiceStack.ServiceHost;
using ServiceStack.ServiceInterface;
using System;
+using System.Collections.Generic;
using System.Globalization;
using System.IO;
using System.Linq;
@@ -22,12 +21,6 @@ namespace MediaBrowser.Common.Implementations.HttpServer
///
public class BaseRestService : Service, IRestfulService
{
- ///
- /// Gets or sets the kernel.
- ///
- /// The kernel.
- public IKernel Kernel { get; set; }
-
///
/// Gets or sets the logger.
///
diff --git a/MediaBrowser.Common.Implementations/MediaBrowser.Common.Implementations.csproj b/MediaBrowser.Common.Implementations/MediaBrowser.Common.Implementations.csproj
index 831b111ec7..84769637a3 100644
--- a/MediaBrowser.Common.Implementations/MediaBrowser.Common.Implementations.csproj
+++ b/MediaBrowser.Common.Implementations/MediaBrowser.Common.Implementations.csproj
@@ -38,6 +38,9 @@
..\packages\Alchemy.2.2.1\lib\net40\Alchemy.dll
+
+ ..\ThirdParty\PluginSecurity\Mediabrowser.PluginSecurity.dll
+
..\packages\NLog.2.0.0.2000\lib\net40\NLog.dll
@@ -104,6 +107,7 @@
+
@@ -123,6 +127,7 @@
+
diff --git a/MediaBrowser.Common.Implementations/ScheduledTasks/ScheduledTaskWorker.cs b/MediaBrowser.Common.Implementations/ScheduledTasks/ScheduledTaskWorker.cs
index eada385564..d5adf32658 100644
--- a/MediaBrowser.Common.Implementations/ScheduledTasks/ScheduledTaskWorker.cs
+++ b/MediaBrowser.Common.Implementations/ScheduledTasks/ScheduledTaskWorker.cs
@@ -1,4 +1,5 @@
-using MediaBrowser.Common.Extensions;
+using MediaBrowser.Common.Configuration;
+using MediaBrowser.Common.Extensions;
using MediaBrowser.Common.Kernel;
using MediaBrowser.Common.ScheduledTasks;
using MediaBrowser.Model.Logging;
diff --git a/MediaBrowser.Common.Implementations/ScheduledTasks/TaskManager.cs b/MediaBrowser.Common.Implementations/ScheduledTasks/TaskManager.cs
index efd3478a1e..946887303c 100644
--- a/MediaBrowser.Common.Implementations/ScheduledTasks/TaskManager.cs
+++ b/MediaBrowser.Common.Implementations/ScheduledTasks/TaskManager.cs
@@ -1,4 +1,5 @@
-using MediaBrowser.Common.Kernel;
+using MediaBrowser.Common.Configuration;
+using MediaBrowser.Common.Kernel;
using MediaBrowser.Common.ScheduledTasks;
using MediaBrowser.Model.Logging;
using MediaBrowser.Model.Serialization;
diff --git a/MediaBrowser.Common.Implementations/ScheduledTasks/Tasks/DeleteCacheFileTask.cs b/MediaBrowser.Common.Implementations/ScheduledTasks/Tasks/DeleteCacheFileTask.cs
index a9c82c3578..c7a19c0c03 100644
--- a/MediaBrowser.Common.Implementations/ScheduledTasks/Tasks/DeleteCacheFileTask.cs
+++ b/MediaBrowser.Common.Implementations/ScheduledTasks/Tasks/DeleteCacheFileTask.cs
@@ -1,4 +1,4 @@
-using MediaBrowser.Common.Kernel;
+using MediaBrowser.Common.Configuration;
using MediaBrowser.Common.ScheduledTasks;
using MediaBrowser.Model.Logging;
using System;
@@ -16,10 +16,10 @@ namespace MediaBrowser.Common.Implementations.ScheduledTasks.Tasks
public class DeleteCacheFileTask : IScheduledTask
{
///
- /// Gets or sets the kernel.
+ /// Gets or sets the application paths.
///
- /// The kernel.
- private IKernel Kernel { get; set; }
+ /// The application paths.
+ private IApplicationPaths ApplicationPaths { get; set; }
///
/// Gets or sets the logger.
///
@@ -29,11 +29,11 @@ namespace MediaBrowser.Common.Implementations.ScheduledTasks.Tasks
///
/// Initializes a new instance of the class.
///
- /// The kernel.
+ /// The app paths.
/// The logger.
- public DeleteCacheFileTask(IKernel kernel, ILogger logger)
+ public DeleteCacheFileTask(IApplicationPaths appPaths, ILogger logger)
{
- Kernel = kernel;
+ ApplicationPaths = appPaths;
Logger = logger;
}
@@ -60,7 +60,7 @@ namespace MediaBrowser.Common.Implementations.ScheduledTasks.Tasks
{
var minDateModified = DateTime.UtcNow.AddMonths(-2);
- DeleteCacheFilesFromDirectory(cancellationToken, Kernel.ApplicationPaths.CachePath, minDateModified, progress);
+ DeleteCacheFilesFromDirectory(cancellationToken, ApplicationPaths.CachePath, minDateModified, progress);
});
}
diff --git a/MediaBrowser.Common.Implementations/ScheduledTasks/Tasks/DeleteLogFileTask.cs b/MediaBrowser.Common.Implementations/ScheduledTasks/Tasks/DeleteLogFileTask.cs
index a7d8a68a04..faeb39735f 100644
--- a/MediaBrowser.Common.Implementations/ScheduledTasks/Tasks/DeleteLogFileTask.cs
+++ b/MediaBrowser.Common.Implementations/ScheduledTasks/Tasks/DeleteLogFileTask.cs
@@ -1,4 +1,4 @@
-using MediaBrowser.Common.Kernel;
+using MediaBrowser.Common.Configuration;
using MediaBrowser.Common.ScheduledTasks;
using MediaBrowser.Model.Logging;
using System;
@@ -16,10 +16,10 @@ namespace MediaBrowser.Common.Implementations.ScheduledTasks.Tasks
public class DeleteLogFileTask : IScheduledTask
{
///
- /// Gets or sets the kernel.
+ /// Gets or sets the configuration manager.
///
- /// The kernel.
- private IKernel Kernel { get; set; }
+ /// The configuration manager.
+ private IConfigurationManager ConfigurationManager { get; set; }
///
/// Gets or sets the logger.
///
@@ -29,11 +29,11 @@ namespace MediaBrowser.Common.Implementations.ScheduledTasks.Tasks
///
/// Initializes a new instance of the class.
///
- /// The kernel.
+ /// The configuration manager.
/// The logger.
- public DeleteLogFileTask(IKernel kernel, ILogger logger)
+ public DeleteLogFileTask(IConfigurationManager configurationManager, ILogger logger)
{
- Kernel = kernel;
+ ConfigurationManager = configurationManager;
Logger = logger;
}
@@ -59,9 +59,9 @@ namespace MediaBrowser.Common.Implementations.ScheduledTasks.Tasks
return Task.Run(() =>
{
// Delete log files more than n days old
- var minDateModified = DateTime.UtcNow.AddDays(-(Kernel.Configuration.LogFileRetentionDays));
+ var minDateModified = DateTime.UtcNow.AddDays(-(ConfigurationManager.CommonConfiguration.LogFileRetentionDays));
- var filesToDelete = new DirectoryInfo(Kernel.ApplicationPaths.LogDirectoryPath).EnumerateFileSystemInfos("*", SearchOption.AllDirectories)
+ var filesToDelete = new DirectoryInfo(ConfigurationManager.CommonApplicationPaths.LogDirectoryPath).EnumerateFileSystemInfos("*", SearchOption.AllDirectories)
.Where(f => f.LastWriteTimeUtc < minDateModified)
.ToList();
@@ -100,7 +100,7 @@ namespace MediaBrowser.Common.Implementations.ScheduledTasks.Tasks
/// The description.
public string Description
{
- get { return string.Format("Deletes log files that are more than {0} days old.", Kernel.Configuration.LogFileRetentionDays); }
+ get { return string.Format("Deletes log files that are more than {0} days old.", ConfigurationManager.CommonConfiguration.LogFileRetentionDays); }
}
///
diff --git a/MediaBrowser.Common.Implementations/ScheduledTasks/Tasks/ReloadLoggerTask.cs b/MediaBrowser.Common.Implementations/ScheduledTasks/Tasks/ReloadLoggerTask.cs
index ea1e8b9382..a02f9dec6b 100644
--- a/MediaBrowser.Common.Implementations/ScheduledTasks/Tasks/ReloadLoggerTask.cs
+++ b/MediaBrowser.Common.Implementations/ScheduledTasks/Tasks/ReloadLoggerTask.cs
@@ -1,4 +1,4 @@
-using MediaBrowser.Common.Kernel;
+using MediaBrowser.Common.Configuration;
using MediaBrowser.Common.ScheduledTasks;
using MediaBrowser.Model.Logging;
using System;
@@ -24,22 +24,22 @@ namespace MediaBrowser.Common.Implementations.ScheduledTasks.Tasks
/// The logger.
private ILogger Logger { get; set; }
///
- /// Gets or sets the kernel.
+ /// Gets or sets the configuration manager.
///
- /// The kernel.
- private IKernel Kernel { get; set; }
+ /// The configuration manager.
+ private IConfigurationManager ConfigurationManager { get; set; }
///
/// Initializes a new instance of the class.
///
/// The logManager.
/// The logger.
- /// The kernel.
- public ReloadLoggerFileTask(ILogManager logManager, ILogger logger, IKernel kernel)
+ /// The configuration manager.
+ public ReloadLoggerFileTask(ILogManager logManager, ILogger logger, IConfigurationManager configurationManager)
{
LogManager = logManager;
Logger = logger;
- Kernel = kernel;
+ ConfigurationManager = configurationManager;
}
///
@@ -65,7 +65,7 @@ namespace MediaBrowser.Common.Implementations.ScheduledTasks.Tasks
progress.Report(0);
- return Task.Run(() => LogManager.ReloadLogger(Kernel.Configuration.EnableDebugLevelLogging ? LogSeverity.Debug : LogSeverity.Info));
+ return Task.Run(() => LogManager.ReloadLogger(ConfigurationManager.CommonConfiguration.EnableDebugLevelLogging ? LogSeverity.Debug : LogSeverity.Info));
}
///
diff --git a/MediaBrowser.Common.Implementations/ScheduledTasks/Tasks/SystemUpdateTask.cs b/MediaBrowser.Common.Implementations/ScheduledTasks/Tasks/SystemUpdateTask.cs
index 0091e14c0e..7da1b9c5a5 100644
--- a/MediaBrowser.Common.Implementations/ScheduledTasks/Tasks/SystemUpdateTask.cs
+++ b/MediaBrowser.Common.Implementations/ScheduledTasks/Tasks/SystemUpdateTask.cs
@@ -1,4 +1,5 @@
-using MediaBrowser.Common.Kernel;
+using MediaBrowser.Common.Configuration;
+using MediaBrowser.Common.Kernel;
using MediaBrowser.Common.ScheduledTasks;
using MediaBrowser.Model.Logging;
using System;
@@ -19,27 +20,35 @@ namespace MediaBrowser.Common.Implementations.ScheduledTasks.Tasks
private readonly IApplicationHost _appHost;
///
- /// Gets or sets the kernel.
+ /// Gets or sets the configuration manager.
///
- /// The kernel.
- private IKernel Kernel { get; set; }
+ /// The configuration manager.
+ private IConfigurationManager ConfigurationManager { get; set; }
///
/// Gets or sets the logger.
///
/// The logger.
private ILogger Logger { get; set; }
+ ///
+ /// Gets or sets the kernel.
+ ///
+ /// The kernel.
+ private IKernel Kernel { get; set; }
+
///
/// Initializes a new instance of the class.
///
/// The app host.
- /// The kernel.
+ /// The configuration manager.
/// The logger.
- public SystemUpdateTask(IApplicationHost appHost, IKernel kernel, ILogger logger)
+ /// The kernel.
+ public SystemUpdateTask(IApplicationHost appHost, IConfigurationManager configurationManager, ILogger logger, IKernel kernel)
{
_appHost = appHost;
- Kernel = kernel;
+ ConfigurationManager = configurationManager;
Logger = logger;
+ Kernel = kernel;
}
///
@@ -88,7 +97,7 @@ namespace MediaBrowser.Common.Implementations.ScheduledTasks.Tasks
cancellationToken.ThrowIfCancellationRequested();
- if (Kernel.Configuration.EnableAutoUpdate)
+ if (ConfigurationManager.CommonConfiguration.EnableAutoUpdate)
{
Logger.Info("Update Revision {0} available. Updating...", updateInfo.AvailableVersion);
diff --git a/MediaBrowser.Controller/Plugins/PluginSecurityManager.cs b/MediaBrowser.Common.Implementations/Security/PluginSecurityManager.cs
similarity index 95%
rename from MediaBrowser.Controller/Plugins/PluginSecurityManager.cs
rename to MediaBrowser.Common.Implementations/Security/PluginSecurityManager.cs
index 3a097ba1ff..a566373714 100644
--- a/MediaBrowser.Controller/Plugins/PluginSecurityManager.cs
+++ b/MediaBrowser.Common.Implementations/Security/PluginSecurityManager.cs
@@ -1,4 +1,5 @@
-using MediaBrowser.Common.Security;
+using MediaBrowser.Common.Configuration;
+using MediaBrowser.Common.Security;
using MediaBrowser.Model.Serialization;
using Mediabrowser.Model.Entities;
using Mediabrowser.PluginSecurity;
@@ -8,7 +9,7 @@ using System;
using System.Threading;
using System.Threading.Tasks;
-namespace MediaBrowser.Controller.Plugins
+namespace MediaBrowser.Common.Implementations.Security
{
///
/// Class PluginSecurityManager
@@ -68,7 +69,7 @@ namespace MediaBrowser.Controller.Plugins
_kernel = kernel;
_httpClient = httpClient;
_jsonSerializer = jsonSerializer;
- MBRegistration.Init(appPaths);
+ //MBRegistration.Init(appPaths);
}
///
diff --git a/MediaBrowser.Common.Implementations/ServerManager/ServerManager.cs b/MediaBrowser.Common.Implementations/ServerManager/ServerManager.cs
index 31f6922c23..d18971f72e 100644
--- a/MediaBrowser.Common.Implementations/ServerManager/ServerManager.cs
+++ b/MediaBrowser.Common.Implementations/ServerManager/ServerManager.cs
@@ -1,4 +1,5 @@
-using MediaBrowser.Common.Kernel;
+using MediaBrowser.Common.Configuration;
+using MediaBrowser.Common.Kernel;
using MediaBrowser.Common.Net;
using MediaBrowser.Model.Logging;
using MediaBrowser.Model.Serialization;
@@ -77,6 +78,12 @@ namespace MediaBrowser.Common.Implementations.ServerManager
///
private readonly IKernel _kernel;
+ ///
+ /// Gets or sets the configuration manager.
+ ///
+ /// The configuration manager.
+ private IConfigurationManager ConfigurationManager { get; set; }
+
///
/// Gets a value indicating whether [supports web socket].
///
@@ -92,14 +99,14 @@ namespace MediaBrowser.Common.Implementations.ServerManager
/// The web socket port number.
public int WebSocketPortNumber
{
- get { return SupportsNativeWebSocket ? _kernel.Configuration.HttpServerPortNumber : _kernel.Configuration.LegacyWebSocketPortNumber; }
+ get { return SupportsNativeWebSocket ? ConfigurationManager.CommonConfiguration.HttpServerPortNumber : ConfigurationManager.CommonConfiguration.LegacyWebSocketPortNumber; }
}
///
/// Gets the web socket listeners.
///
/// The web socket listeners.
- private List WebSocketListeners = new List();
+ private readonly List _webSocketListeners = new List();
///
/// Initializes a new instance of the class.
@@ -109,8 +116,9 @@ namespace MediaBrowser.Common.Implementations.ServerManager
/// The network manager.
/// The json serializer.
/// The logger.
+ /// The configuration manager.
/// applicationHost
- public ServerManager(IApplicationHost applicationHost, IKernel kernel, INetworkManager networkManager, IJsonSerializer jsonSerializer, ILogger logger)
+ public ServerManager(IApplicationHost applicationHost, IKernel kernel, INetworkManager networkManager, IJsonSerializer jsonSerializer, ILogger logger, IConfigurationManager configurationManager)
{
if (applicationHost == null)
{
@@ -138,6 +146,7 @@ namespace MediaBrowser.Common.Implementations.ServerManager
_kernel = kernel;
_applicationHost = applicationHost;
_networkManager = networkManager;
+ ConfigurationManager = configurationManager;
}
///
@@ -158,7 +167,7 @@ namespace MediaBrowser.Common.Implementations.ServerManager
ReloadExternalWebSocketServer();
}
- _kernel.ConfigurationUpdated += _kernel_ConfigurationUpdated;
+ ConfigurationManager.ConfigurationUpdated += _kernel_ConfigurationUpdated;
}
///
@@ -176,7 +185,7 @@ namespace MediaBrowser.Common.Implementations.ServerManager
ExternalWebSocketServer = _applicationHost.Resolve();
- ExternalWebSocketServer.Start(_kernel.Configuration.LegacyWebSocketPortNumber);
+ ExternalWebSocketServer.Start(ConfigurationManager.CommonConfiguration.LegacyWebSocketPortNumber);
ExternalWebSocketServer.WebSocketConnected += HttpServer_WebSocketConnected;
}
@@ -199,7 +208,7 @@ namespace MediaBrowser.Common.Implementations.ServerManager
try
{
HttpServer = _applicationHost.Resolve();
- HttpServer.EnableHttpRequestLogging = _kernel.Configuration.EnableHttpLevelLogging;
+ HttpServer.EnableHttpRequestLogging = ConfigurationManager.CommonConfiguration.EnableHttpLevelLogging;
HttpServer.Start(_kernel.HttpServerUrlPrefix);
}
catch (HttpListenerException ex)
@@ -240,7 +249,7 @@ namespace MediaBrowser.Common.Implementations.ServerManager
/// The result.
private async void ProcessWebSocketMessageReceived(WebSocketMessageInfo result)
{
- var tasks = WebSocketListeners.Select(i => Task.Run(async () =>
+ var tasks = _webSocketListeners.Select(i => Task.Run(async () =>
{
try
{
@@ -435,7 +444,7 @@ namespace MediaBrowser.Common.Implementations.ServerManager
private void RegisterServerWithAdministratorAccess()
{
// Create a temp file path to extract the bat file to
- var tmpFile = Path.Combine(_kernel.ApplicationPaths.TempDirectory, Guid.NewGuid() + ".bat");
+ var tmpFile = Path.Combine(ConfigurationManager.CommonApplicationPaths.TempDirectory, Guid.NewGuid() + ".bat");
// Extract the bat file
using (var stream = Assembly.GetExecutingAssembly().GetManifestResourceStream("MediaBrowser.Common.Implementations.ServerManager.RegisterServer.bat"))
@@ -450,10 +459,10 @@ namespace MediaBrowser.Common.Implementations.ServerManager
{
FileName = tmpFile,
- Arguments = string.Format("{0} {1} {2} {3}", _kernel.Configuration.HttpServerPortNumber,
+ Arguments = string.Format("{0} {1} {2} {3}", ConfigurationManager.CommonConfiguration.HttpServerPortNumber,
_kernel.HttpServerUrlPrefix,
_kernel.UdpServerPortNumber,
- _kernel.Configuration.LegacyWebSocketPortNumber),
+ ConfigurationManager.CommonConfiguration.LegacyWebSocketPortNumber),
CreateNoWindow = true,
WindowStyle = ProcessWindowStyle.Hidden,
@@ -508,14 +517,14 @@ namespace MediaBrowser.Common.Implementations.ServerManager
///
void _kernel_ConfigurationUpdated(object sender, EventArgs e)
{
- HttpServer.EnableHttpRequestLogging = _kernel.Configuration.EnableHttpLevelLogging;
+ HttpServer.EnableHttpRequestLogging = ConfigurationManager.CommonConfiguration.EnableHttpLevelLogging;
if (!string.Equals(HttpServer.UrlPrefix, _kernel.HttpServerUrlPrefix, StringComparison.OrdinalIgnoreCase))
{
ReloadHttpServer();
}
- if (!SupportsNativeWebSocket && ExternalWebSocketServer != null && ExternalWebSocketServer.Port != _kernel.Configuration.LegacyWebSocketPortNumber)
+ if (!SupportsNativeWebSocket && ExternalWebSocketServer != null && ExternalWebSocketServer.Port != ConfigurationManager.CommonConfiguration.LegacyWebSocketPortNumber)
{
ReloadExternalWebSocketServer();
}
@@ -527,7 +536,7 @@ namespace MediaBrowser.Common.Implementations.ServerManager
/// The listeners.
public void AddWebSocketListeners(IEnumerable listeners)
{
- WebSocketListeners.AddRange(listeners);
+ _webSocketListeners.AddRange(listeners);
}
}
}
diff --git a/MediaBrowser.Common.Implementations/Updates/PackageManager.cs b/MediaBrowser.Common.Implementations/Updates/PackageManager.cs
index cef631e607..f73857da18 100644
--- a/MediaBrowser.Common.Implementations/Updates/PackageManager.cs
+++ b/MediaBrowser.Common.Implementations/Updates/PackageManager.cs
@@ -1,37 +1,57 @@
-using System;
+using MediaBrowser.Common.Configuration;
+using MediaBrowser.Common.Net;
+using MediaBrowser.Common.Security;
+using MediaBrowser.Common.Updates;
+using MediaBrowser.Model.Logging;
+using MediaBrowser.Model.Serialization;
+using MediaBrowser.Model.Updates;
+using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Security.Cryptography;
using System.Threading;
using System.Threading.Tasks;
-using MediaBrowser.Common.Kernel;
-using MediaBrowser.Common.Net;
-using MediaBrowser.Common.Security;
-using MediaBrowser.Common.Updates;
-using MediaBrowser.Model.IO;
-using MediaBrowser.Model.Logging;
-using MediaBrowser.Model.Serialization;
-using MediaBrowser.Model.Updates;
namespace MediaBrowser.Common.Implementations.Updates
{
public class PackageManager : IPackageManager
{
- public async Task> GetAvailablePackages(IHttpClient client,
- INetworkManager networkManager,
- ISecurityManager securityManager,
- ResourcePool resourcePool,
- IJsonSerializer serializer,
- CancellationToken cancellationToken)
- {
- var data = new Dictionary { { "key", securityManager.SupporterKey }, { "mac", networkManager.GetMacAddress() } };
+ private readonly ISecurityManager _securityManager;
+ private readonly INetworkManager _networkManager;
+ private readonly IHttpClient _httpClient;
+ private readonly IApplicationPaths _appPaths;
+ private readonly IJsonSerializer _jsonSerializer;
+ private readonly ILogger _logger;
- using (var json = await client.Post(Constants.Constants.MBAdminUrl + "service/package/retrieveall", data, resourcePool.Mb, cancellationToken).ConfigureAwait(false))
+ ///
+ /// Initializes a new instance of the class.
+ ///
+ /// The security manager.
+ /// The network manager.
+ /// The HTTP client.
+ /// The application paths.
+ /// The json serializer.
+ /// The logger.
+ public PackageManager(ISecurityManager securityManager, INetworkManager networkManager, IHttpClient httpClient, IApplicationPaths applicationPaths, IJsonSerializer jsonSerializer, ILogger logger)
+ {
+ _securityManager = securityManager;
+ _networkManager = networkManager;
+ _httpClient = httpClient;
+ _appPaths = applicationPaths;
+ _jsonSerializer = jsonSerializer;
+ _logger = logger;
+ }
+
+ public async Task> GetAvailablePackages(CancellationToken cancellationToken)
+ {
+ var data = new Dictionary { { "key", _securityManager.SupporterKey }, { "mac", _networkManager.GetMacAddress() } };
+
+ using (var json = await _httpClient.Post(Constants.Constants.MBAdminUrl + "service/package/retrieveall", data, cancellationToken).ConfigureAwait(false))
{
cancellationToken.ThrowIfCancellationRequested();
- var packages = serializer.DeserializeFromStream>(json).ToList();
+ var packages = _jsonSerializer.DeserializeFromStream>(json).ToList();
foreach (var package in packages)
{
package.versions = package.versions.Where(v => !string.IsNullOrWhiteSpace(v.sourceUrl))
@@ -43,15 +63,15 @@ namespace MediaBrowser.Common.Implementations.Updates
}
- public async Task InstallPackage(IHttpClient client, ILogger logger, ResourcePool resourcePool, IProgress progress, IApplicationPaths appPaths, PackageVersionInfo package, CancellationToken cancellationToken)
+ public async Task InstallPackage(IProgress progress, PackageVersionInfo package, CancellationToken cancellationToken)
{
// Target based on if it is an archive or single assembly
// zip archives are assumed to contain directory structures relative to our ProgramDataPath
var isArchive = string.Equals(Path.GetExtension(package.targetFilename), ".zip", StringComparison.OrdinalIgnoreCase);
- var target = Path.Combine(isArchive ? appPaths.TempUpdatePath : appPaths.PluginsPath, package.targetFilename);
+ var target = Path.Combine(isArchive ? _appPaths.TempUpdatePath : _appPaths.PluginsPath, package.targetFilename);
// Download to temporary file so that, if interrupted, it won't destroy the existing installation
- var tempFile = await client.GetTempFile(package.sourceUrl, resourcePool.Mb, cancellationToken, progress).ConfigureAwait(false);
+ var tempFile = await _httpClient.GetTempFile(package.sourceUrl, cancellationToken, progress).ConfigureAwait(false);
cancellationToken.ThrowIfCancellationRequested();
@@ -79,7 +99,7 @@ namespace MediaBrowser.Common.Implementations.Updates
}
catch (IOException e)
{
- logger.ErrorException("Error attempting to move file from {0} to {1}", e, tempFile, target);
+ _logger.ErrorException("Error attempting to move file from {0} to {1}", e, tempFile, target);
throw;
}
diff --git a/MediaBrowser.Common/Configuration/ConfigurationHelper.cs b/MediaBrowser.Common/Configuration/ConfigurationHelper.cs
new file mode 100644
index 0000000000..fc74a6a4d0
--- /dev/null
+++ b/MediaBrowser.Common/Configuration/ConfigurationHelper.cs
@@ -0,0 +1,68 @@
+using MediaBrowser.Model.Serialization;
+using System;
+using System.IO;
+using System.Linq;
+
+namespace MediaBrowser.Common.Configuration
+{
+ ///
+ /// Class ConfigurationHelper
+ ///
+ public static class ConfigurationHelper
+ {
+ ///
+ /// Reads an xml configuration file from the file system
+ /// It will immediately re-serialize and save if new serialization data is available due to property changes
+ ///
+ /// The type.
+ /// The path.
+ /// The XML serializer.
+ /// System.Object.
+ public static object GetXmlConfiguration(Type type, string path, IXmlSerializer xmlSerializer)
+ {
+ object configuration;
+
+ byte[] buffer = null;
+
+ // Use try/catch to avoid the extra file system lookup using File.Exists
+ try
+ {
+ buffer = File.ReadAllBytes(path);
+
+ configuration = xmlSerializer.DeserializeFromBytes(type, buffer);
+ }
+ catch (FileNotFoundException)
+ {
+ configuration = Activator.CreateInstance(type);
+ }
+
+ // Take the object we just got and serialize it back to bytes
+ var newBytes = xmlSerializer.SerializeToBytes(configuration);
+
+ // If the file didn't exist before, or if something has changed, re-save
+ if (buffer == null || !buffer.SequenceEqual(newBytes))
+ {
+ // Save it after load in case we got new items
+ File.WriteAllBytes(path, newBytes);
+ }
+
+ return configuration;
+ }
+
+
+ ///
+ /// Reads an xml configuration file from the file system
+ /// It will immediately save the configuration after loading it, just
+ /// in case there are new serializable properties
+ ///
+ ///
+ /// The path.
+ /// The XML serializer.
+ /// ``0.
+ public static T GetXmlConfiguration(string path, IXmlSerializer xmlSerializer)
+ where T : class
+ {
+ return GetXmlConfiguration(typeof(T), path, xmlSerializer) as T;
+ }
+ }
+}
diff --git a/MediaBrowser.Common/Kernel/IApplicationPaths.cs b/MediaBrowser.Common/Configuration/IApplicationPaths.cs
similarity index 98%
rename from MediaBrowser.Common/Kernel/IApplicationPaths.cs
rename to MediaBrowser.Common/Configuration/IApplicationPaths.cs
index 52c3b199d8..d2446ce46d 100644
--- a/MediaBrowser.Common/Kernel/IApplicationPaths.cs
+++ b/MediaBrowser.Common/Configuration/IApplicationPaths.cs
@@ -1,5 +1,5 @@
-namespace MediaBrowser.Common.Kernel
+namespace MediaBrowser.Common.Configuration
{
///
/// Interface IApplicationPaths
diff --git a/MediaBrowser.Common/Configuration/IConfigurationManager.cs b/MediaBrowser.Common/Configuration/IConfigurationManager.cs
new file mode 100644
index 0000000000..0d0759b666
--- /dev/null
+++ b/MediaBrowser.Common/Configuration/IConfigurationManager.cs
@@ -0,0 +1,36 @@
+using MediaBrowser.Model.Configuration;
+using System;
+
+namespace MediaBrowser.Common.Configuration
+{
+ public interface IConfigurationManager
+ {
+ ///
+ /// Occurs when [configuration updated].
+ ///
+ event EventHandler ConfigurationUpdated;
+
+ ///
+ /// Gets or sets the application paths.
+ ///
+ /// The application paths.
+ IApplicationPaths CommonApplicationPaths { get; }
+
+ ///
+ /// Gets the configuration.
+ ///
+ /// The configuration.
+ BaseApplicationConfiguration CommonConfiguration { get; }
+
+ ///
+ /// Saves the configuration.
+ ///
+ void SaveConfiguration();
+
+ ///
+ /// Replaces the configuration.
+ ///
+ /// The new configuration.
+ void ReplaceConfiguration(BaseApplicationConfiguration newConfiguration);
+ }
+}
diff --git a/MediaBrowser.Common/Kernel/IApplicationHost.cs b/MediaBrowser.Common/IApplicationHost.cs
similarity index 93%
rename from MediaBrowser.Common/Kernel/IApplicationHost.cs
rename to MediaBrowser.Common/IApplicationHost.cs
index 38a1cb3180..4bd90e531e 100644
--- a/MediaBrowser.Common/Kernel/IApplicationHost.cs
+++ b/MediaBrowser.Common/IApplicationHost.cs
@@ -5,7 +5,7 @@ using System.Collections.Generic;
using System.Threading;
using System.Threading.Tasks;
-namespace MediaBrowser.Common.Kernel
+namespace MediaBrowser.Common
{
///
/// An interface to be implemented by the applications hosting a kernel
@@ -17,12 +17,6 @@ namespace MediaBrowser.Common.Kernel
///
void Restart();
- ///
- /// Configures the auto run at startup.
- ///
- /// if set to true [autorun].
- void ConfigureAutoRunAtStartup(bool autorun);
-
///
/// Gets the application version.
///
diff --git a/MediaBrowser.Common/Kernel/BaseKernel.cs b/MediaBrowser.Common/Kernel/BaseKernel.cs
index 489423d9eb..cf8133e977 100644
--- a/MediaBrowser.Common/Kernel/BaseKernel.cs
+++ b/MediaBrowser.Common/Kernel/BaseKernel.cs
@@ -1,45 +1,21 @@
-using MediaBrowser.Common.Events;
-using MediaBrowser.Common.Security;
-using MediaBrowser.Model.Configuration;
+using MediaBrowser.Common.Configuration;
+using MediaBrowser.Common.Events;
using MediaBrowser.Model.Logging;
-using MediaBrowser.Model.Serialization;
using MediaBrowser.Model.System;
using System;
-using System.IO;
-using System.Linq;
-using System.Threading;
namespace MediaBrowser.Common.Kernel
{
///
/// Represents a shared base kernel for both the Ui and server apps
///
- /// The type of the T configuration type.
- /// The type of the T application paths type.
- public abstract class BaseKernel : IDisposable, IKernel
- where TConfigurationType : BaseApplicationConfiguration, new()
- where TApplicationPathsType : IApplicationPaths
+ public abstract class BaseKernel : IKernel
{
///
/// Occurs when [has pending restart changed].
///
public event EventHandler HasPendingRestartChanged;
- #region ConfigurationUpdated Event
- ///
- /// Occurs when [configuration updated].
- ///
- public event EventHandler ConfigurationUpdated;
-
- ///
- /// Called when [configuration updated].
- ///
- internal void OnConfigurationUpdated()
- {
- EventHelper.QueueEventIfNotNull(ConfigurationUpdated, this, EventArgs.Empty, Logger);
- }
- #endregion
-
#region ApplicationUpdated Event
///
/// Occurs when [application updated].
@@ -57,65 +33,12 @@ namespace MediaBrowser.Common.Kernel
}
#endregion
- ///
- /// The _configuration loaded
- ///
- private bool _configurationLoaded;
- ///
- /// The _configuration sync lock
- ///
- private object _configurationSyncLock = new object();
- ///
- /// The _configuration
- ///
- private TConfigurationType _configuration;
- ///
- /// Gets the system configuration
- ///
- /// The configuration.
- public TConfigurationType Configuration
- {
- get
- {
- // Lazy load
- LazyInitializer.EnsureInitialized(ref _configuration, ref _configurationLoaded, ref _configurationSyncLock, () => GetXmlConfiguration(ApplicationPaths.SystemConfigurationFilePath));
- return _configuration;
- }
- protected set
- {
- _configuration = value;
-
- if (value == null)
- {
- _configurationLoaded = false;
- }
- }
- }
-
///
/// Gets or sets a value indicating whether this instance has changes that require the entire application to restart.
///
/// true if this instance has pending application restart; otherwise, false.
public bool HasPendingRestart { get; private set; }
- ///
- /// Gets the application paths.
- ///
- /// The application paths.
- public TApplicationPathsType ApplicationPaths { get; private set; }
-
- ///
- /// Gets or sets the TCP manager.
- ///
- /// The TCP manager.
- private IServerManager ServerManager { get; set; }
-
- ///
- /// Gets the plug-in security manager.
- ///
- /// The plug-in security manager.
- public ISecurityManager SecurityManager { get; set; }
-
///
/// Gets the UDP server port number.
/// This can't be configurable because then the user would have to configure their client to discover the server.
@@ -141,7 +64,7 @@ namespace MediaBrowser.Common.Kernel
{
get
{
- return "http://+:" + Configuration.HttpServerPortNumber + "/" + WebApplicationName + "/";
+ return "http://+:" + _configurationManager.CommonConfiguration.HttpServerPortNumber + "/" + WebApplicationName + "/";
}
}
@@ -163,25 +86,18 @@ namespace MediaBrowser.Common.Kernel
/// The application host.
protected IApplicationHost ApplicationHost { get; private set; }
- ///
- /// The _XML serializer
- ///
- private readonly IXmlSerializer _xmlSerializer;
+ private readonly IConfigurationManager _configurationManager;
///
- /// Initializes a new instance of the class.
+ /// Initializes a new instance of the class.
///
/// The app host.
- /// The app paths.
- /// The XML serializer.
- /// The logger.
- /// isoManager
- protected BaseKernel(IApplicationHost appHost, TApplicationPathsType appPaths, IXmlSerializer xmlSerializer, ILogger logger)
+ /// The log manager.
+ protected BaseKernel(IApplicationHost appHost, ILogManager logManager, IConfigurationManager configurationManager)
{
- ApplicationPaths = appPaths;
ApplicationHost = appHost;
- _xmlSerializer = xmlSerializer;
- Logger = logger;
+ _configurationManager = configurationManager;
+ Logger = logManager.GetLogger("Kernel");
}
///
@@ -201,7 +117,6 @@ namespace MediaBrowser.Common.Kernel
/// Task.
protected virtual void ReloadInternal()
{
- ServerManager = ApplicationHost.Resolve();
}
///
@@ -214,24 +129,6 @@ namespace MediaBrowser.Common.Kernel
EventHelper.QueueEventIfNotNull(HasPendingRestartChanged, this, EventArgs.Empty, Logger);
}
- ///
- /// Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources.
- ///
- public void Dispose()
- {
- Dispose(true);
- GC.SuppressFinalize(this);
- }
-
- ///
- /// Releases unmanaged and - optionally - managed resources.
- ///
- /// true to release both managed and unmanaged resources; false to release only unmanaged resources.
- protected virtual void Dispose(bool dispose)
- {
-
- }
-
///
/// Performs the pending restart.
///
@@ -261,108 +158,10 @@ namespace MediaBrowser.Common.Kernel
HasPendingRestart = HasPendingRestart,
Version = ApplicationHost.ApplicationVersion.ToString(),
IsNetworkDeployed = ApplicationHost.CanSelfUpdate,
- WebSocketPortNumber = ServerManager.WebSocketPortNumber,
- SupportsNativeWebSocket = ServerManager.SupportsNativeWebSocket,
+ WebSocketPortNumber = ApplicationHost.Resolve().WebSocketPortNumber,
+ SupportsNativeWebSocket = ApplicationHost.Resolve().SupportsNativeWebSocket,
FailedPluginAssemblies = ApplicationHost.FailedAssemblies.ToArray()
};
}
-
- ///
- /// The _save lock
- ///
- private readonly object _configurationSaveLock = new object();
-
- ///
- /// Saves the current configuration
- ///
- public void SaveConfiguration()
- {
- lock (_configurationSaveLock)
- {
- _xmlSerializer.SerializeToFile(Configuration, ApplicationPaths.SystemConfigurationFilePath);
- }
-
- OnConfigurationUpdated();
- }
-
- ///
- /// Gets the application paths.
- ///
- /// The application paths.
- IApplicationPaths IKernel.ApplicationPaths
- {
- get { return ApplicationPaths; }
- }
- ///
- /// Gets the configuration.
- ///
- /// The configuration.
- BaseApplicationConfiguration IKernel.Configuration
- {
- get { return Configuration; }
- }
-
- ///
- /// Reads an xml configuration file from the file system
- /// It will immediately re-serialize and save if new serialization data is available due to property changes
- ///
- /// The type.
- /// The path.
- /// System.Object.
- public object GetXmlConfiguration(Type type, string path)
- {
- Logger.Info("Loading {0} at {1}", type.Name, path);
-
- object configuration;
-
- byte[] buffer = null;
-
- // Use try/catch to avoid the extra file system lookup using File.Exists
- try
- {
- buffer = File.ReadAllBytes(path);
-
- configuration = _xmlSerializer.DeserializeFromBytes(type, buffer);
- }
- catch (FileNotFoundException)
- {
- configuration = Activator.CreateInstance(type);
- }
-
- // Take the object we just got and serialize it back to bytes
- var newBytes = _xmlSerializer.SerializeToBytes(configuration);
-
- // If the file didn't exist before, or if something has changed, re-save
- if (buffer == null || !buffer.SequenceEqual(newBytes))
- {
- Logger.Info("Saving {0} to {1}", type.Name, path);
-
- // Save it after load in case we got new items
- File.WriteAllBytes(path, newBytes);
- }
-
- return configuration;
- }
-
-
- ///
- /// Reads an xml configuration file from the file system
- /// It will immediately save the configuration after loading it, just
- /// in case there are new serializable properties
- ///
- ///
- /// The path.
- /// ``0.
- private T GetXmlConfiguration(string path)
- where T : class
- {
- return GetXmlConfiguration(typeof(T), path) as T;
- }
-
- ///
- /// Limits simultaneous access to various resources
- ///
- /// The resource pools.
- public ResourcePool ResourcePools { get; set; }
}
}
diff --git a/MediaBrowser.Common/Kernel/IKernel.cs b/MediaBrowser.Common/Kernel/IKernel.cs
index 1a2d86d7f2..51677677ac 100644
--- a/MediaBrowser.Common/Kernel/IKernel.cs
+++ b/MediaBrowser.Common/Kernel/IKernel.cs
@@ -1,35 +1,18 @@
-using MediaBrowser.Common.Plugins;
-using MediaBrowser.Common.Security;
-using MediaBrowser.Model.Configuration;
-using MediaBrowser.Model.System;
+using MediaBrowser.Model.System;
using System;
-using System.Collections.Generic;
-using System.Threading.Tasks;
namespace MediaBrowser.Common.Kernel
{
///
/// Interface IKernel
///
- public interface IKernel : IDisposable
+ public interface IKernel
{
///
/// Occurs when [has pending restart changed].
///
event EventHandler HasPendingRestartChanged;
- ///
- /// Gets the application paths.
- ///
- /// The application paths.
- IApplicationPaths ApplicationPaths { get; }
-
- ///
- /// Gets the configuration.
- ///
- /// The configuration.
- BaseApplicationConfiguration Configuration { get; }
-
///
/// Gets the kernel context.
///
@@ -83,34 +66,9 @@ namespace MediaBrowser.Common.Kernel
/// The HTTP server URL prefix.
string HttpServerUrlPrefix { get; }
- ///
- /// Gets the plug-in security manager.
- ///
- /// The plug-in security manager.
- ISecurityManager SecurityManager { get; set; }
-
- ///
- /// Occurs when [configuration updated].
- ///
- event EventHandler ConfigurationUpdated;
-
///
/// Notifies the pending restart.
///
void NotifyPendingRestart();
-
- ///
- /// Gets the XML configuration.
- ///
- /// The type.
- /// The path.
- /// System.Object.
- object GetXmlConfiguration(Type type, string path);
-
- ///
- /// Limits simultaneous access to various resources
- ///
- /// The resource pools.
- ResourcePool ResourcePools { get; set; }
}
}
diff --git a/MediaBrowser.Common/Kernel/ResourcePool.cs b/MediaBrowser.Common/Kernel/ResourcePool.cs
deleted file mode 100644
index 8a2ab8af8e..0000000000
--- a/MediaBrowser.Common/Kernel/ResourcePool.cs
+++ /dev/null
@@ -1,79 +0,0 @@
-using System;
-using System.Threading;
-
-namespace MediaBrowser.Common.Kernel
-{
- ///
- /// This is just a collection of semaphores to control the number of concurrent executions of various resources
- ///
- public class ResourcePool : IDisposable
- {
- ///
- /// You tube
- ///
- public readonly SemaphoreSlim YouTube = new SemaphoreSlim(5, 5);
-
- ///
- /// The trakt
- ///
- public readonly SemaphoreSlim Trakt = new SemaphoreSlim(5, 5);
-
- ///
- /// The tv db
- ///
- public readonly SemaphoreSlim TvDb = new SemaphoreSlim(5, 5);
-
- ///
- /// The movie db
- ///
- public readonly SemaphoreSlim MovieDb = new SemaphoreSlim(5, 5);
-
- ///
- /// The fan art
- ///
- public readonly SemaphoreSlim FanArt = new SemaphoreSlim(5, 5);
-
- ///
- /// The mb
- ///
- public readonly SemaphoreSlim Mb = new SemaphoreSlim(5, 5);
-
- ///
- /// Apple doesn't seem to like too many simulataneous requests.
- ///
- public readonly SemaphoreSlim AppleTrailerVideos = new SemaphoreSlim(1, 1);
-
- ///
- /// The apple trailer images
- ///
- public readonly SemaphoreSlim AppleTrailerImages = new SemaphoreSlim(1, 1);
-
- ///
- /// Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources.
- ///
- public void Dispose()
- {
- Dispose(true);
- GC.SuppressFinalize(this);
- }
-
- ///
- /// Releases unmanaged and - optionally - managed resources.
- ///
- /// true to release both managed and unmanaged resources; false to release only unmanaged resources.
- protected virtual void Dispose(bool dispose)
- {
- if (dispose)
- {
- YouTube.Dispose();
- Trakt.Dispose();
- TvDb.Dispose();
- MovieDb.Dispose();
- FanArt.Dispose();
- Mb.Dispose();
- AppleTrailerVideos.Dispose();
- AppleTrailerImages.Dispose();
- }
- }
- }
-}
diff --git a/MediaBrowser.Common/MediaBrowser.Common.csproj b/MediaBrowser.Common/MediaBrowser.Common.csproj
index 284649b53d..8b7aae9cb1 100644
--- a/MediaBrowser.Common/MediaBrowser.Common.csproj
+++ b/MediaBrowser.Common/MediaBrowser.Common.csproj
@@ -46,6 +46,8 @@
Properties\SharedVersion.cs
+
+
@@ -58,14 +60,11 @@
-
+
-
+
-
-
-
@@ -97,7 +96,6 @@
-
diff --git a/MediaBrowser.Common/Net/Handlers/BaseHandler.cs b/MediaBrowser.Common/Net/Handlers/BaseHandler.cs
deleted file mode 100644
index 5d26c7e920..0000000000
--- a/MediaBrowser.Common/Net/Handlers/BaseHandler.cs
+++ /dev/null
@@ -1,808 +0,0 @@
-using MediaBrowser.Common.Extensions;
-using MediaBrowser.Common.Kernel;
-using System;
-using System.Collections;
-using System.Collections.Generic;
-using System.Collections.Specialized;
-using System.Globalization;
-using System.IO;
-using System.IO.Compression;
-using System.Linq;
-using System.Net;
-using System.Text;
-using System.Threading.Tasks;
-
-namespace MediaBrowser.Common.Net.Handlers
-{
- ///
- /// Class BaseHandler
- ///
- public abstract class BaseHandler : IHttpServerHandler
- where TKernelType : IKernel
- {
- ///
- /// Initializes the specified kernel.
- ///
- /// The kernel.
- public void Initialize(IKernel kernel)
- {
- Kernel = (TKernelType)kernel;
- }
-
- ///
- /// Gets or sets the kernel.
- ///
- /// The kernel.
- protected TKernelType Kernel { get; private set; }
-
- ///
- /// Gets the URL suffix used to determine if this handler can process a request.
- ///
- /// The URL suffix.
- protected virtual string UrlSuffix
- {
- get
- {
- var name = GetType().Name;
-
- const string srch = "Handler";
-
- if (name.EndsWith(srch, StringComparison.OrdinalIgnoreCase))
- {
- name = name.Substring(0, name.Length - srch.Length);
- }
-
- return "api/" + name;
- }
- }
-
- ///
- /// Handleses the request.
- ///
- /// The request.
- /// true if XXXX, false otherwise
- public virtual bool HandlesRequest(HttpListenerRequest request)
- {
- var name = '/' + UrlSuffix.TrimStart('/');
-
- var url = Kernel.WebApplicationName + name;
-
- return request.Url.LocalPath.EndsWith(url, StringComparison.OrdinalIgnoreCase);
- }
-
- ///
- /// Gets or sets the compressed stream.
- ///
- /// The compressed stream.
- private Stream CompressedStream { get; set; }
-
- ///
- /// Gets a value indicating whether [use chunked encoding].
- ///
- /// null if [use chunked encoding] contains no value, true if [use chunked encoding]; otherwise, false.
- public virtual bool? UseChunkedEncoding
- {
- get
- {
- return null;
- }
- }
-
- ///
- /// The original HttpListenerContext
- ///
- /// The HTTP listener context.
- protected HttpListenerContext HttpListenerContext { get; set; }
-
- ///
- /// The _query string
- ///
- private NameValueCollection _queryString;
- ///
- /// The original QueryString
- ///
- /// The query string.
- public NameValueCollection QueryString
- {
- get
- {
- // HttpListenerContext.Request.QueryString is not decoded properly
- return _queryString;
- }
- }
-
- ///
- /// The _requested ranges
- ///
- private List> _requestedRanges;
- ///
- /// Gets the requested ranges.
- ///
- /// The requested ranges.
- protected IEnumerable> RequestedRanges
- {
- get
- {
- if (_requestedRanges == null)
- {
- _requestedRanges = new List>();
-
- if (IsRangeRequest)
- {
- // Example: bytes=0-,32-63
- var ranges = HttpListenerContext.Request.Headers["Range"].Split('=')[1].Split(',');
-
- foreach (var range in ranges)
- {
- var vals = range.Split('-');
-
- long start = 0;
- long? end = null;
-
- if (!string.IsNullOrEmpty(vals[0]))
- {
- start = long.Parse(vals[0]);
- }
- if (!string.IsNullOrEmpty(vals[1]))
- {
- end = long.Parse(vals[1]);
- }
-
- _requestedRanges.Add(new KeyValuePair(start, end));
- }
- }
- }
-
- return _requestedRanges;
- }
- }
-
- ///
- /// Gets a value indicating whether this instance is range request.
- ///
- /// true if this instance is range request; otherwise, false.
- protected bool IsRangeRequest
- {
- get
- {
- return HttpListenerContext.Request.Headers.AllKeys.Contains("Range");
- }
- }
-
- ///
- /// Gets a value indicating whether [client supports compression].
- ///
- /// true if [client supports compression]; otherwise, false.
- protected bool ClientSupportsCompression
- {
- get
- {
- var enc = HttpListenerContext.Request.Headers["Accept-Encoding"] ?? string.Empty;
-
- return enc.Equals("*", StringComparison.OrdinalIgnoreCase) ||
- enc.IndexOf("deflate", StringComparison.OrdinalIgnoreCase) != -1 ||
- enc.IndexOf("gzip", StringComparison.OrdinalIgnoreCase) != -1;
- }
- }
-
- ///
- /// Gets the compression method.
- ///
- /// The compression method.
- private string CompressionMethod
- {
- get
- {
- var enc = HttpListenerContext.Request.Headers["Accept-Encoding"] ?? string.Empty;
-
- if (enc.IndexOf("deflate", StringComparison.OrdinalIgnoreCase) != -1 || enc.Equals("*", StringComparison.OrdinalIgnoreCase))
- {
- return "deflate";
- }
- if (enc.IndexOf("gzip", StringComparison.OrdinalIgnoreCase) != -1)
- {
- return "gzip";
- }
-
- return null;
- }
- }
-
- ///
- /// Processes the request.
- ///
- /// The CTX.
- /// Task.
- public virtual async Task ProcessRequest(HttpListenerContext ctx)
- {
- HttpListenerContext = ctx;
-
- ctx.Response.AddHeader("Access-Control-Allow-Origin", "*");
-
- ctx.Response.KeepAlive = true;
-
- try
- {
- await ProcessRequestInternal(ctx).ConfigureAwait(false);
- }
- catch (InvalidOperationException ex)
- {
- HandleException(ctx.Response, ex, 422);
-
- throw;
- }
- catch (ResourceNotFoundException ex)
- {
- HandleException(ctx.Response, ex, 404);
-
- throw;
- }
- catch (FileNotFoundException ex)
- {
- HandleException(ctx.Response, ex, 404);
-
- throw;
- }
- catch (DirectoryNotFoundException ex)
- {
- HandleException(ctx.Response, ex, 404);
-
- throw;
- }
- catch (UnauthorizedAccessException ex)
- {
- HandleException(ctx.Response, ex, 401);
-
- throw;
- }
- catch (ArgumentException ex)
- {
- HandleException(ctx.Response, ex, 400);
-
- throw;
- }
- catch (Exception ex)
- {
- HandleException(ctx.Response, ex, 500);
-
- throw;
- }
- finally
- {
- DisposeResponseStream();
- }
- }
-
- ///
- /// Appends the error message.
- ///
- /// The response.
- /// The ex.
- /// The status code.
- private void HandleException(HttpListenerResponse response, Exception ex, int statusCode)
- {
- response.StatusCode = statusCode;
-
- response.Headers.Add("Status", statusCode.ToString(new CultureInfo("en-US")));
-
- response.Headers.Remove("Age");
- response.Headers.Remove("Expires");
- response.Headers.Remove("Cache-Control");
- response.Headers.Remove("Etag");
- response.Headers.Remove("Last-Modified");
-
- response.ContentType = "text/plain";
-
- //Logger.ErrorException("Error processing request", ex);
-
- if (!string.IsNullOrEmpty(ex.Message))
- {
- response.AddHeader("X-Application-Error-Code", ex.Message);
- }
-
- var bytes = Encoding.UTF8.GetBytes(ex.Message);
-
- var stream = CompressedStream ?? response.OutputStream;
-
- // This could fail, but try to add the stack trace as the body content
- try
- {
- stream.Write(bytes, 0, bytes.Length);
- }
- catch (Exception ex1)
- {
- //Logger.ErrorException("Error dumping stack trace", ex1);
- }
- }
-
- ///
- /// Processes the request internal.
- ///
- /// The CTX.
- /// Task.
- private async Task ProcessRequestInternal(HttpListenerContext ctx)
- {
- var responseInfo = await GetResponseInfo().ConfigureAwait(false);
-
- // Let the client know if byte range requests are supported or not
- if (responseInfo.SupportsByteRangeRequests)
- {
- ctx.Response.Headers["Accept-Ranges"] = "bytes";
- }
- else if (!responseInfo.SupportsByteRangeRequests)
- {
- ctx.Response.Headers["Accept-Ranges"] = "none";
- }
-
- if (responseInfo.IsResponseValid && responseInfo.SupportsByteRangeRequests && IsRangeRequest)
- {
- // Set the initial status code
- // When serving a range request, we need to return status code 206 to indicate a partial response body
- responseInfo.StatusCode = 206;
- }
-
- ctx.Response.ContentType = responseInfo.ContentType;
-
- if (responseInfo.Etag.HasValue)
- {
- ctx.Response.Headers["ETag"] = responseInfo.Etag.Value.ToString("N");
- }
-
- var isCacheValid = true;
-
- // Validate If-Modified-Since
- if (ctx.Request.Headers.AllKeys.Contains("If-Modified-Since"))
- {
- DateTime ifModifiedSince;
-
- if (DateTime.TryParse(ctx.Request.Headers["If-Modified-Since"], out ifModifiedSince))
- {
- isCacheValid = IsCacheValid(ifModifiedSince.ToUniversalTime(), responseInfo.CacheDuration,
- responseInfo.DateLastModified);
- }
- }
-
- // Validate If-None-Match
- if (isCacheValid &&
- (responseInfo.Etag.HasValue || !string.IsNullOrEmpty(ctx.Request.Headers["If-None-Match"])))
- {
- Guid ifNoneMatch;
-
- if (Guid.TryParse(ctx.Request.Headers["If-None-Match"] ?? string.Empty, out ifNoneMatch))
- {
- if (responseInfo.Etag.HasValue && responseInfo.Etag.Value == ifNoneMatch)
- {
- responseInfo.StatusCode = 304;
- }
- }
- }
-
- LogResponse(ctx, responseInfo);
-
- if (responseInfo.IsResponseValid)
- {
- await OnProcessingRequest(responseInfo).ConfigureAwait(false);
- }
-
- if (responseInfo.IsResponseValid)
- {
- await ProcessUncachedRequest(ctx, responseInfo).ConfigureAwait(false);
- }
- else
- {
- if (responseInfo.StatusCode == 304)
- {
- AddAgeHeader(ctx.Response, responseInfo);
- AddExpiresHeader(ctx.Response, responseInfo);
- }
-
- ctx.Response.StatusCode = responseInfo.StatusCode;
- ctx.Response.SendChunked = false;
- }
- }
-
- ///
- /// The _null task result
- ///
- private readonly Task _nullTaskResult = Task.FromResult(true);
-
- ///
- /// Called when [processing request].
- ///
- /// The response info.
- /// Task.
- protected virtual Task OnProcessingRequest(ResponseInfo responseInfo)
- {
- return _nullTaskResult;
- }
-
- ///
- /// Logs the response.
- ///
- /// The CTX.
- /// The response info.
- private void LogResponse(HttpListenerContext ctx, ResponseInfo responseInfo)
- {
- // Don't log normal 200's
- if (responseInfo.StatusCode == 200)
- {
- return;
- }
-
- var log = new StringBuilder();
-
- log.AppendLine(string.Format("Url: {0}", ctx.Request.Url));
-
- log.AppendLine("Headers: " + string.Join(",", ctx.Response.Headers.AllKeys.Select(k => k + "=" + ctx.Response.Headers[k])));
-
- var msg = "Http Response Sent (" + responseInfo.StatusCode + ") to " + ctx.Request.RemoteEndPoint;
-
- if (Kernel.Configuration.EnableHttpLevelLogging)
- {
- //Logger.LogMultiline(msg, LogSeverity.Debug, log);
- }
- }
-
- ///
- /// Processes the uncached request.
- ///
- /// The CTX.
- /// The response info.
- /// Task.
- private async Task ProcessUncachedRequest(HttpListenerContext ctx, ResponseInfo responseInfo)
- {
- var totalContentLength = GetTotalContentLength(responseInfo);
-
- // By default, use chunked encoding if we don't know the content length
- var useChunkedEncoding = UseChunkedEncoding == null ? (totalContentLength == null) : UseChunkedEncoding.Value;
-
- // Don't force this to true. HttpListener will default it to true if supported by the client.
- if (!useChunkedEncoding)
- {
- ctx.Response.SendChunked = false;
- }
-
- // Set the content length, if we know it
- if (totalContentLength.HasValue)
- {
- ctx.Response.ContentLength64 = totalContentLength.Value;
- }
-
- var compressResponse = responseInfo.CompressResponse && ClientSupportsCompression;
-
- // Add the compression header
- if (compressResponse)
- {
- ctx.Response.AddHeader("Content-Encoding", CompressionMethod);
- ctx.Response.AddHeader("Vary", "Accept-Encoding");
- }
-
- // Don't specify both last modified and Etag, unless caching unconditionally. They are redundant
- // https://developers.google.com/speed/docs/best-practices/caching#LeverageBrowserCaching
- if (responseInfo.DateLastModified.HasValue && (!responseInfo.Etag.HasValue || responseInfo.CacheDuration.Ticks > 0))
- {
- ctx.Response.Headers[HttpResponseHeader.LastModified] = responseInfo.DateLastModified.Value.ToString("r");
- AddAgeHeader(ctx.Response, responseInfo);
- }
-
- // Add caching headers
- ConfigureCaching(ctx.Response, responseInfo);
-
- // Set the status code
- ctx.Response.StatusCode = responseInfo.StatusCode;
-
- if (responseInfo.IsResponseValid)
- {
- // Finally, write the response data
- var outputStream = ctx.Response.OutputStream;
-
- if (compressResponse)
- {
- if (CompressionMethod.Equals("deflate", StringComparison.OrdinalIgnoreCase))
- {
- CompressedStream = new DeflateStream(outputStream, CompressionLevel.Fastest, true);
- }
- else
- {
- CompressedStream = new GZipStream(outputStream, CompressionLevel.Fastest, true);
- }
-
- outputStream = CompressedStream;
- }
-
- await WriteResponseToOutputStream(outputStream, responseInfo, totalContentLength).ConfigureAwait(false);
- }
- else
- {
- ctx.Response.SendChunked = false;
- }
- }
-
- ///
- /// Configures the caching.
- ///
- /// The response.
- /// The response info.
- private void ConfigureCaching(HttpListenerResponse response, ResponseInfo responseInfo)
- {
- if (responseInfo.CacheDuration.Ticks > 0)
- {
- response.Headers[HttpResponseHeader.CacheControl] = "public, max-age=" + Convert.ToInt32(responseInfo.CacheDuration.TotalSeconds);
- }
- else if (responseInfo.Etag.HasValue)
- {
- response.Headers[HttpResponseHeader.CacheControl] = "public";
- }
- else
- {
- response.Headers[HttpResponseHeader.CacheControl] = "no-cache, no-store, must-revalidate";
- response.Headers[HttpResponseHeader.Pragma] = "no-cache, no-store, must-revalidate";
- }
-
- AddExpiresHeader(response, responseInfo);
- }
-
- ///
- /// Adds the expires header.
- ///
- /// The response.
- /// The response info.
- private void AddExpiresHeader(HttpListenerResponse response, ResponseInfo responseInfo)
- {
- if (responseInfo.CacheDuration.Ticks > 0)
- {
- response.Headers[HttpResponseHeader.Expires] = DateTime.UtcNow.Add(responseInfo.CacheDuration).ToString("r");
- }
- else if (!responseInfo.Etag.HasValue)
- {
- response.Headers[HttpResponseHeader.Expires] = "-1";
- }
- }
-
- ///
- /// Adds the age header.
- ///
- /// The response.
- /// The response info.
- private void AddAgeHeader(HttpListenerResponse response, ResponseInfo responseInfo)
- {
- if (responseInfo.DateLastModified.HasValue)
- {
- response.Headers[HttpResponseHeader.Age] = Convert.ToInt32((DateTime.UtcNow - responseInfo.DateLastModified.Value).TotalSeconds).ToString(CultureInfo.InvariantCulture);
- }
- }
-
- ///
- /// Writes the response to output stream.
- ///
- /// The stream.
- /// The response info.
- /// Length of the content.
- /// Task.
- protected abstract Task WriteResponseToOutputStream(Stream stream, ResponseInfo responseInfo, long? contentLength);
-
- ///
- /// Disposes the response stream.
- ///
- protected virtual void DisposeResponseStream()
- {
- if (CompressedStream != null)
- {
- try
- {
- CompressedStream.Dispose();
- }
- catch (Exception ex)
- {
- //Logger.ErrorException("Error disposing compressed stream", ex);
- }
- }
-
- try
- {
- //HttpListenerContext.Response.OutputStream.Dispose();
- HttpListenerContext.Response.Close();
- }
- catch (Exception ex)
- {
- //Logger.ErrorException("Error disposing response", ex);
- }
- }
-
- ///
- /// Determines whether [is cache valid] [the specified if modified since].
- ///
- /// If modified since.
- /// Duration of the cache.
- /// The date modified.
- /// true if [is cache valid] [the specified if modified since]; otherwise, false.
- private bool IsCacheValid(DateTime ifModifiedSince, TimeSpan cacheDuration, DateTime? dateModified)
- {
- if (dateModified.HasValue)
- {
- DateTime lastModified = NormalizeDateForComparison(dateModified.Value);
- ifModifiedSince = NormalizeDateForComparison(ifModifiedSince);
-
- return lastModified <= ifModifiedSince;
- }
-
- DateTime cacheExpirationDate = ifModifiedSince.Add(cacheDuration);
-
- if (DateTime.UtcNow < cacheExpirationDate)
- {
- return true;
- }
-
- return false;
- }
-
- ///
- /// When the browser sends the IfModifiedDate, it's precision is limited to seconds, so this will account for that
- ///
- /// The date.
- /// DateTime.
- private DateTime NormalizeDateForComparison(DateTime date)
- {
- return new DateTime(date.Year, date.Month, date.Day, date.Hour, date.Minute, date.Second, date.Kind);
- }
-
- ///
- /// Gets the total length of the content.
- ///
- /// The response info.
- /// System.Nullable{System.Int64}.
- protected virtual long? GetTotalContentLength(ResponseInfo responseInfo)
- {
- return null;
- }
-
- ///
- /// Gets the response info.
- ///
- /// Task{ResponseInfo}.
- protected abstract Task GetResponseInfo();
-
- ///
- /// Gets a bool query string param.
- ///
- /// The name.
- /// true if XXXX, false otherwise
- protected bool GetBoolQueryStringParam(string name)
- {
- var val = QueryString[name] ?? string.Empty;
-
- return val.Equals("1", StringComparison.OrdinalIgnoreCase) || val.Equals("true", StringComparison.OrdinalIgnoreCase);
- }
-
- ///
- /// The _form values
- ///
- private Hashtable _formValues;
-
- ///
- /// Gets a value from form POST data
- ///
- /// The name.
- /// Task{System.String}.
- protected async Task GetFormValue(string name)
- {
- if (_formValues == null)
- {
- _formValues = await GetFormValues(HttpListenerContext.Request).ConfigureAwait(false);
- }
-
- if (_formValues.ContainsKey(name))
- {
- return _formValues[name].ToString();
- }
-
- return null;
- }
-
- ///
- /// Extracts form POST data from a request
- ///
- /// The request.
- /// Task{Hashtable}.
- private async Task GetFormValues(HttpListenerRequest request)
- {
- var formVars = new Hashtable();
-
- if (request.HasEntityBody)
- {
- if (request.ContentType.IndexOf("application/x-www-form-urlencoded", StringComparison.OrdinalIgnoreCase) != -1)
- {
- using (var requestBody = request.InputStream)
- {
- using (var reader = new StreamReader(requestBody, request.ContentEncoding))
- {
- var s = await reader.ReadToEndAsync().ConfigureAwait(false);
-
- var pairs = s.Split('&');
-
- foreach (var pair in pairs)
- {
- var index = pair.IndexOf('=');
-
- if (index != -1)
- {
- var name = pair.Substring(0, index);
- var value = pair.Substring(index + 1);
- formVars.Add(name, value);
- }
- }
- }
- }
- }
- }
-
- return formVars;
- }
- }
-
- ///
- /// Class ResponseInfo
- ///
- public class ResponseInfo
- {
- ///
- /// Gets or sets the type of the content.
- ///
- /// The type of the content.
- public string ContentType { get; set; }
- ///
- /// Gets or sets the etag.
- ///
- /// The etag.
- public Guid? Etag { get; set; }
- ///
- /// Gets or sets the date last modified.
- ///
- /// The date last modified.
- public DateTime? DateLastModified { get; set; }
- ///
- /// Gets or sets the duration of the cache.
- ///
- /// The duration of the cache.
- public TimeSpan CacheDuration { get; set; }
- ///
- /// Gets or sets a value indicating whether [compress response].
- ///
- /// true if [compress response]; otherwise, false.
- public bool CompressResponse { get; set; }
- ///
- /// Gets or sets the status code.
- ///
- /// The status code.
- public int StatusCode { get; set; }
- ///
- /// Gets or sets a value indicating whether [supports byte range requests].
- ///
- /// true if [supports byte range requests]; otherwise, false.
- public bool SupportsByteRangeRequests { get; set; }
-
- ///
- /// Initializes a new instance of the class.
- ///
- public ResponseInfo()
- {
- CacheDuration = TimeSpan.FromTicks(0);
-
- CompressResponse = true;
-
- StatusCode = 200;
- }
-
- ///
- /// Gets a value indicating whether this instance is response valid.
- ///
- /// true if this instance is response valid; otherwise, false.
- public bool IsResponseValid
- {
- get
- {
- return StatusCode >= 200 && StatusCode < 300;
- }
- }
- }
-}
\ No newline at end of file
diff --git a/MediaBrowser.Common/Net/Handlers/IHttpServerHandler.cs b/MediaBrowser.Common/Net/Handlers/IHttpServerHandler.cs
deleted file mode 100644
index dadd614737..0000000000
--- a/MediaBrowser.Common/Net/Handlers/IHttpServerHandler.cs
+++ /dev/null
@@ -1,32 +0,0 @@
-using MediaBrowser.Common.Kernel;
-using System.Net;
-using System.Threading.Tasks;
-
-namespace MediaBrowser.Common.Net.Handlers
-{
- ///
- /// Interface IHttpServerHandler
- ///
- public interface IHttpServerHandler
- {
- ///
- /// Initializes the specified kernel.
- ///
- /// The kernel.
- void Initialize(IKernel kernel);
-
- ///
- /// Handleses the request.
- ///
- /// The request.
- /// true if XXXX, false otherwise
- bool HandlesRequest(HttpListenerRequest request);
-
- ///
- /// Processes the request.
- ///
- /// The CTX.
- /// Task.
- Task ProcessRequest(HttpListenerContext ctx);
- }
-}
diff --git a/MediaBrowser.Common/Net/Handlers/StaticFileHandler.cs b/MediaBrowser.Common/Net/Handlers/StaticFileHandler.cs
deleted file mode 100644
index 3967d15c35..0000000000
--- a/MediaBrowser.Common/Net/Handlers/StaticFileHandler.cs
+++ /dev/null
@@ -1,264 +0,0 @@
-using MediaBrowser.Common.Extensions;
-using MediaBrowser.Common.IO;
-using MediaBrowser.Common.Kernel;
-using System;
-using System.Collections.Generic;
-using System.IO;
-using System.Linq;
-using System.Threading.Tasks;
-
-namespace MediaBrowser.Common.Net.Handlers
-{
- ///
- /// Represents an http handler that serves static content
- ///
- public class StaticFileHandler : BaseHandler
- {
- ///
- /// Initializes a new instance of the class.
- ///
- /// The kernel.
- public StaticFileHandler(IKernel kernel)
- {
- Initialize(kernel);
- }
-
- ///
- /// The _path
- ///
- private string _path;
- ///
- /// Gets or sets the path to the static resource
- ///
- /// The path.
- public string Path
- {
- get
- {
- if (!string.IsNullOrWhiteSpace(_path))
- {
- return _path;
- }
-
- return QueryString["path"];
- }
- set
- {
- _path = value;
- }
- }
-
- ///
- /// Gets or sets the last date modified of the resource
- ///
- /// The last date modified.
- public DateTime? LastDateModified { get; set; }
-
- ///
- /// Gets or sets the content type of the resource
- ///
- /// The type of the content.
- public string ContentType { get; set; }
-
- ///
- /// Gets or sets the content type of the resource
- ///
- /// The etag.
- public Guid Etag { get; set; }
-
- ///
- /// Gets or sets the source stream of the resource
- ///
- /// The source stream.
- public Stream SourceStream { get; set; }
-
- ///
- /// Shoulds the compress response.
- ///
- /// Type of the content.
- /// true if XXXX, false otherwise
- private bool ShouldCompressResponse(string contentType)
- {
- // It will take some work to support compression with byte range requests
- if (IsRangeRequest)
- {
- return false;
- }
-
- // Don't compress media
- if (contentType.StartsWith("audio/", StringComparison.OrdinalIgnoreCase) || contentType.StartsWith("video/", StringComparison.OrdinalIgnoreCase))
- {
- return false;
- }
-
- // Don't compress images
- if (contentType.StartsWith("image/", StringComparison.OrdinalIgnoreCase))
- {
- return false;
- }
-
- return true;
- }
-
- ///
- /// Gets or sets the duration of the cache.
- ///
- /// The duration of the cache.
- public TimeSpan? CacheDuration { get; set; }
-
- ///
- /// Gets the total length of the content.
- ///
- /// The response info.
- /// System.Nullable{System.Int64}.
- protected override long? GetTotalContentLength(ResponseInfo responseInfo)
- {
- // If we're compressing the response, content length must be the compressed length, which we don't know
- if (responseInfo.CompressResponse && ClientSupportsCompression)
- {
- return null;
- }
-
- return SourceStream.Length;
- }
-
- ///
- /// Gets the response info.
- ///
- /// Task{ResponseInfo}.
- protected override Task GetResponseInfo()
- {
- var info = new ResponseInfo
- {
- ContentType = ContentType ?? MimeTypes.GetMimeType(Path),
- Etag = Etag,
- DateLastModified = LastDateModified
- };
-
- if (SourceStream == null && !string.IsNullOrEmpty(Path))
- {
- // FileShare must be ReadWrite in case someone else is currently writing to it.
- SourceStream = new FileStream(Path, FileMode.Open, FileAccess.Read, FileShare.Read, StreamDefaults.DefaultFileStreamBufferSize, FileOptions.Asynchronous);
- }
-
- info.CompressResponse = ShouldCompressResponse(info.ContentType);
-
- info.SupportsByteRangeRequests = !info.CompressResponse || !ClientSupportsCompression;
-
- if (!info.DateLastModified.HasValue && !string.IsNullOrWhiteSpace(Path))
- {
- info.DateLastModified = File.GetLastWriteTimeUtc(Path);
- }
-
- if (CacheDuration.HasValue)
- {
- info.CacheDuration = CacheDuration.Value;
- }
-
- if (SourceStream == null && string.IsNullOrEmpty(Path))
- {
- throw new ResourceNotFoundException();
- }
-
- return Task.FromResult(info);
- }
-
- ///
- /// Writes the response to output stream.
- ///
- /// The stream.
- /// The response info.
- /// Total length of the content.
- /// Task.
- protected override Task WriteResponseToOutputStream(Stream stream, ResponseInfo responseInfo, long? totalContentLength)
- {
- if (IsRangeRequest && totalContentLength.HasValue)
- {
- var requestedRange = RequestedRanges.First();
-
- // If the requested range is "0-", we can optimize by just doing a stream copy
- if (!requestedRange.Value.HasValue)
- {
- return ServeCompleteRangeRequest(requestedRange, stream, totalContentLength.Value);
- }
-
- // This will have to buffer a portion of the content into memory
- return ServePartialRangeRequest(requestedRange.Key, requestedRange.Value.Value, stream, totalContentLength.Value);
- }
-
- return SourceStream.CopyToAsync(stream);
- }
-
- ///
- /// Disposes the response stream.
- ///
- protected override void DisposeResponseStream()
- {
- if (SourceStream != null)
- {
- SourceStream.Dispose();
- }
-
- base.DisposeResponseStream();
- }
-
- ///
- /// Handles a range request of "bytes=0-"
- /// This will serve the complete content and add the content-range header
- ///
- /// The requested range.
- /// The response stream.
- /// Total length of the content.
- /// Task.
- private Task ServeCompleteRangeRequest(KeyValuePair requestedRange, Stream responseStream, long totalContentLength)
- {
- var rangeStart = requestedRange.Key;
- var rangeEnd = totalContentLength - 1;
- var rangeLength = 1 + rangeEnd - rangeStart;
-
- // Content-Length is the length of what we're serving, not the original content
- HttpListenerContext.Response.ContentLength64 = rangeLength;
- HttpListenerContext.Response.Headers["Content-Range"] = string.Format("bytes {0}-{1}/{2}", rangeStart, rangeEnd, totalContentLength);
-
- if (rangeStart > 0)
- {
- SourceStream.Position = rangeStart;
- }
-
- return SourceStream.CopyToAsync(responseStream);
- }
-
- ///
- /// Serves a partial range request
- ///
- /// The range start.
- /// The range end.
- /// The response stream.
- /// Total length of the content.
- /// Task.
- private async Task ServePartialRangeRequest(long rangeStart, long rangeEnd, Stream responseStream, long totalContentLength)
- {
- var rangeLength = 1 + rangeEnd - rangeStart;
-
- // Content-Length is the length of what we're serving, not the original content
- HttpListenerContext.Response.ContentLength64 = rangeLength;
- HttpListenerContext.Response.Headers["Content-Range"] = string.Format("bytes {0}-{1}/{2}", rangeStart, rangeEnd, totalContentLength);
-
- SourceStream.Position = rangeStart;
-
- // Fast track to just copy the stream to the end
- if (rangeEnd == totalContentLength - 1)
- {
- await SourceStream.CopyToAsync(responseStream).ConfigureAwait(false);
- }
- else
- {
- // Read the bytes we need
- var buffer = new byte[Convert.ToInt32(rangeLength)];
- await SourceStream.ReadAsync(buffer, 0, buffer.Length).ConfigureAwait(false);
-
- await responseStream.WriteAsync(buffer, 0, Convert.ToInt32(rangeLength)).ConfigureAwait(false);
- }
- }
- }
-}
diff --git a/MediaBrowser.Common/Plugins/BasePlugin.cs b/MediaBrowser.Common/Plugins/BasePlugin.cs
index c968a65c82..4cff2eeb98 100644
--- a/MediaBrowser.Common/Plugins/BasePlugin.cs
+++ b/MediaBrowser.Common/Plugins/BasePlugin.cs
@@ -1,4 +1,4 @@
-using MediaBrowser.Common.Kernel;
+using MediaBrowser.Common.Configuration;
using MediaBrowser.Model.Plugins;
using MediaBrowser.Model.Serialization;
using System;
@@ -17,22 +17,16 @@ namespace MediaBrowser.Common.Plugins
where TConfigurationType : BasePluginConfiguration
{
///
- /// Gets the kernel.
+ /// Gets the application paths.
///
- /// The kernel.
- protected IKernel Kernel { get; private set; }
+ /// The application paths.
+ protected IApplicationPaths ApplicationPaths { get; private set; }
///
/// Gets the XML serializer.
///
/// The XML serializer.
protected IXmlSerializer XmlSerializer { get; private set; }
-
- ///
- /// Gets or sets the plugin's current context
- ///
- /// The context.
- protected KernelContext Context { get { return Kernel.KernelContext; } }
///
/// Gets the name of the plugin
@@ -174,7 +168,7 @@ namespace MediaBrowser.Common.Plugins
{
get
{
- return Path.Combine(Kernel.ApplicationPaths.PluginsPath, AssemblyFileName);
+ return Path.Combine(ApplicationPaths.PluginsPath, AssemblyFileName);
}
}
@@ -199,7 +193,7 @@ namespace MediaBrowser.Common.Plugins
get
{
// Lazy load
- LazyInitializer.EnsureInitialized(ref _configuration, ref _configurationInitialized, ref _configurationSyncLock, () => Kernel.GetXmlConfiguration(ConfigurationType, ConfigurationFilePath) as TConfigurationType);
+ LazyInitializer.EnsureInitialized(ref _configuration, ref _configurationInitialized, ref _configurationSyncLock, () => ConfigurationHelper.GetXmlConfiguration(ConfigurationType, ConfigurationFilePath, XmlSerializer) as TConfigurationType);
return _configuration;
}
protected set
@@ -230,7 +224,7 @@ namespace MediaBrowser.Common.Plugins
{
get
{
- return Path.Combine(Kernel.ApplicationPaths.PluginConfigurationsPath, ConfigurationFileName);
+ return Path.Combine(ApplicationPaths.PluginConfigurationsPath, ConfigurationFileName);
}
}
@@ -250,7 +244,7 @@ namespace MediaBrowser.Common.Plugins
{
// Give the folder name the same name as the config file name
// We can always make this configurable if/when needed
- _dataFolderPath = Path.Combine(Kernel.ApplicationPaths.PluginsPath, Path.GetFileNameWithoutExtension(ConfigurationFileName));
+ _dataFolderPath = Path.Combine(ApplicationPaths.PluginsPath, Path.GetFileNameWithoutExtension(ConfigurationFileName));
if (!Directory.Exists(_dataFolderPath))
{
@@ -265,11 +259,11 @@ namespace MediaBrowser.Common.Plugins
///
/// Initializes a new instance of the class.
///
- /// The kernel.
+ /// The application paths.
/// The XML serializer.
- protected BasePlugin(IKernel kernel, IXmlSerializer xmlSerializer)
+ protected BasePlugin(IApplicationPaths applicationPaths, IXmlSerializer xmlSerializer)
{
- Kernel = kernel;
+ ApplicationPaths = applicationPaths;
XmlSerializer = xmlSerializer;
}
@@ -284,11 +278,6 @@ namespace MediaBrowser.Common.Plugins
/// Cannot call Plugin.SaveConfiguration from the UI.
public virtual void SaveConfiguration()
{
- if (Kernel.KernelContext != KernelContext.Server)
- {
- throw new InvalidOperationException("Cannot call Plugin.SaveConfiguration from the UI.");
- }
-
lock (_configurationSaveLock)
{
XmlSerializer.SerializeToFile(Configuration, ConfigurationFilePath);
diff --git a/MediaBrowser.Common/Updates/ApplicationUpdater.cs b/MediaBrowser.Common/Updates/ApplicationUpdater.cs
index e157c344b7..a796e1bd2d 100644
--- a/MediaBrowser.Common/Updates/ApplicationUpdater.cs
+++ b/MediaBrowser.Common/Updates/ApplicationUpdater.cs
@@ -5,6 +5,7 @@ using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;
+using MediaBrowser.Common.Configuration;
using MediaBrowser.Common.Kernel;
namespace MediaBrowser.Common.Updates
diff --git a/MediaBrowser.Common/Updates/IPackageManager.cs b/MediaBrowser.Common/Updates/IPackageManager.cs
index 1db5ea7066..ecaf9cef83 100644
--- a/MediaBrowser.Common/Updates/IPackageManager.cs
+++ b/MediaBrowser.Common/Updates/IPackageManager.cs
@@ -1,16 +1,8 @@
-using System;
+using MediaBrowser.Model.Updates;
+using System;
using System.Collections.Generic;
-using System.Linq;
-using System.Text;
using System.Threading;
using System.Threading.Tasks;
-using MediaBrowser.Common.Kernel;
-using MediaBrowser.Common.Net;
-using MediaBrowser.Common.Security;
-using MediaBrowser.Model.IO;
-using MediaBrowser.Model.Logging;
-using MediaBrowser.Model.Serialization;
-using MediaBrowser.Model.Updates;
namespace MediaBrowser.Common.Updates
{
@@ -19,37 +11,17 @@ namespace MediaBrowser.Common.Updates
///
/// Gets all available packages.
///
- ///
- ///
- ///
- ///
- ///
/// The cancellation token.
/// Task{List{PackageInfo}}.
- Task> GetAvailablePackages(IHttpClient client,
- INetworkManager networkManager,
- ISecurityManager securityManager,
- ResourcePool resourcePool,
- IJsonSerializer serializer,
- CancellationToken cancellationToken);
+ Task> GetAvailablePackages(CancellationToken cancellationToken);
///
/// Installs a package.
///
- ///
- ///
- ///
///
- ///
/// The package.
/// The cancellation token.
/// Task.
- Task InstallPackage(IHttpClient client,
- ILogger logger,
- ResourcePool resourcePool,
- IProgress progress,
- IApplicationPaths appPaths,
- PackageVersionInfo package,
- CancellationToken cancellationToken);
+ Task InstallPackage(IProgress progress, PackageVersionInfo package, CancellationToken cancellationToken);
}
}
diff --git a/MediaBrowser.Controller/Configuration/IServerConfigurationManager.cs b/MediaBrowser.Controller/Configuration/IServerConfigurationManager.cs
new file mode 100644
index 0000000000..810376f6c6
--- /dev/null
+++ b/MediaBrowser.Controller/Configuration/IServerConfigurationManager.cs
@@ -0,0 +1,23 @@
+using MediaBrowser.Common.Configuration;
+using MediaBrowser.Model.Configuration;
+
+namespace MediaBrowser.Controller.Configuration
+{
+ ///
+ /// Interface IServerConfigurationManager
+ ///
+ public interface IServerConfigurationManager : IConfigurationManager
+ {
+ ///
+ /// Gets the application paths.
+ ///
+ /// The application paths.
+ IServerApplicationPaths ApplicationPaths { get; }
+
+ ///
+ /// Gets the configuration.
+ ///
+ /// The configuration.
+ ServerConfiguration Configuration { get; }
+ }
+}
diff --git a/MediaBrowser.Controller/Drawing/ImageManager.cs b/MediaBrowser.Controller/Drawing/ImageManager.cs
index 766d561156..d95f72df70 100644
--- a/MediaBrowser.Controller/Drawing/ImageManager.cs
+++ b/MediaBrowser.Controller/Drawing/ImageManager.cs
@@ -66,23 +66,23 @@ namespace MediaBrowser.Controller.Drawing
/// The _kernel
///
private readonly Kernel _kernel;
-
+
///
/// Initializes a new instance of the class.
///
/// The kernel.
/// The protobuf serializer.
/// The logger.
- public ImageManager(Kernel kernel, IProtobufSerializer protobufSerializer, ILogger logger)
+ public ImageManager(Kernel kernel, IProtobufSerializer protobufSerializer, ILogger logger, IServerApplicationPaths appPaths)
{
_protobufSerializer = protobufSerializer;
_logger = logger;
_kernel = kernel;
- ImageSizeCache = new FileSystemRepository(Path.Combine(_kernel.ApplicationPaths.ImageCachePath, "image-sizes"));
- ResizedImageCache = new FileSystemRepository(Path.Combine(_kernel.ApplicationPaths.ImageCachePath, "resized-images"));
- CroppedImageCache = new FileSystemRepository(Path.Combine(_kernel.ApplicationPaths.ImageCachePath, "cropped-images"));
- EnhancedImageCache = new FileSystemRepository(Path.Combine(_kernel.ApplicationPaths.ImageCachePath, "enhanced-images"));
+ ImageSizeCache = new FileSystemRepository(Path.Combine(appPaths.ImageCachePath, "image-sizes"));
+ ResizedImageCache = new FileSystemRepository(Path.Combine(appPaths.ImageCachePath, "resized-images"));
+ CroppedImageCache = new FileSystemRepository(Path.Combine(appPaths.ImageCachePath, "cropped-images"));
+ EnhancedImageCache = new FileSystemRepository(Path.Combine(appPaths.ImageCachePath, "enhanced-images"));
}
///
diff --git a/MediaBrowser.Controller/Entities/BaseItem.cs b/MediaBrowser.Controller/Entities/BaseItem.cs
index 47c129dea3..e80c3d71f3 100644
--- a/MediaBrowser.Controller/Entities/BaseItem.cs
+++ b/MediaBrowser.Controller/Entities/BaseItem.cs
@@ -1,4 +1,6 @@
-using MediaBrowser.Common.Extensions;
+using MediaBrowser.Common.Configuration;
+using MediaBrowser.Common.Extensions;
+using MediaBrowser.Controller.Configuration;
using MediaBrowser.Controller.IO;
using MediaBrowser.Controller.Library;
using MediaBrowser.Controller.Localization;
@@ -96,6 +98,7 @@ namespace MediaBrowser.Controller.Entities
///
protected static internal ILogger Logger { get; internal set; }
protected static internal ILibraryManager LibraryManager { get; internal set; }
+ protected static internal IServerConfigurationManager ConfigurationManager { get; internal set; }
///
/// Returns a that represents this instance.
@@ -311,7 +314,7 @@ namespace MediaBrowser.Controller.Entities
// non file-system entries will not have a path
if (string.IsNullOrEmpty(path))
{
- return new ItemResolveArgs
+ return new ItemResolveArgs(ConfigurationManager.ApplicationPaths)
{
FileInfo = new WIN32_FIND_DATA()
};
@@ -329,7 +332,7 @@ namespace MediaBrowser.Controller.Entities
throw new IOException("Unable to retrieve file system info for " + path);
}
- var args = new ItemResolveArgs
+ var args = new ItemResolveArgs(ConfigurationManager.ApplicationPaths)
{
FileInfo = pathInfo.Value,
Path = path,
@@ -997,7 +1000,7 @@ namespace MediaBrowser.Controller.Entities
throw new ArgumentNullException();
}
- return (DateTime.UtcNow - DateCreated).TotalDays < Kernel.Instance.Configuration.RecentItemDays;
+ return (DateTime.UtcNow - DateCreated).TotalDays < ConfigurationManager.Configuration.RecentItemDays;
}
///
@@ -1020,7 +1023,7 @@ namespace MediaBrowser.Controller.Entities
return false;
}
- return (DateTime.UtcNow - data.LastPlayedDate.Value).TotalDays < Kernel.Instance.Configuration.RecentlyPlayedDays;
+ return (DateTime.UtcNow - data.LastPlayedDate.Value).TotalDays < ConfigurationManager.Configuration.RecentlyPlayedDays;
}
///
diff --git a/MediaBrowser.Controller/Entities/User.cs b/MediaBrowser.Controller/Entities/User.cs
index bf77cdc959..ef50a08671 100644
--- a/MediaBrowser.Controller/Entities/User.cs
+++ b/MediaBrowser.Controller/Entities/User.cs
@@ -1,4 +1,5 @@
-using MediaBrowser.Common.Extensions;
+using MediaBrowser.Common.Configuration;
+using MediaBrowser.Common.Extensions;
using MediaBrowser.Controller.IO;
using MediaBrowser.Controller.Library;
using MediaBrowser.Model.Configuration;
@@ -18,6 +19,7 @@ namespace MediaBrowser.Controller.Entities
public class User : BaseItem
{
internal static IUserManager UserManager { get; set; }
+ internal static IXmlSerializer XmlSerializer { get; set; }
///
/// The _root folder path
@@ -45,7 +47,7 @@ namespace MediaBrowser.Controller.Entities
}
else
{
- _rootFolderPath = Kernel.Instance.ApplicationPaths.DefaultUserViewsPath;
+ _rootFolderPath = ConfigurationManager.ApplicationPaths.DefaultUserViewsPath;
}
}
return _rootFolderPath;
@@ -61,7 +63,7 @@ namespace MediaBrowser.Controller.Entities
{
var safeFolderName = FileSystem.GetValidFilename(username);
- return System.IO.Path.Combine(Kernel.Instance.ApplicationPaths.RootFolderPath, safeFolderName);
+ return System.IO.Path.Combine(ConfigurationManager.ApplicationPaths.RootFolderPath, safeFolderName);
}
///
@@ -171,7 +173,7 @@ namespace MediaBrowser.Controller.Entities
get
{
// Lazy load
- LazyInitializer.EnsureInitialized(ref _configuration, ref _configurationInitialized, ref _configurationSyncLock, () => (UserConfiguration)Kernel.Instance.GetXmlConfiguration(typeof(UserConfiguration), ConfigurationFilePath));
+ LazyInitializer.EnsureInitialized(ref _configuration, ref _configurationInitialized, ref _configurationSyncLock, () => (UserConfiguration)ConfigurationHelper.GetXmlConfiguration(typeof(UserConfiguration), ConfigurationFilePath, XmlSerializer));
return _configuration;
}
private set
@@ -321,7 +323,7 @@ namespace MediaBrowser.Controller.Entities
{
var safeFolderName = FileSystem.GetValidFilename(username);
- return System.IO.Path.Combine(Kernel.Instance.ApplicationPaths.UserConfigurationDirectoryPath, safeFolderName);
+ return System.IO.Path.Combine(ConfigurationManager.ApplicationPaths.UserConfigurationDirectoryPath, safeFolderName);
}
///
@@ -411,7 +413,7 @@ namespace MediaBrowser.Controller.Entities
{
var userPath = RootFolderPath;
- var defaultPath = Kernel.Instance.ApplicationPaths.DefaultUserViewsPath;
+ var defaultPath = ConfigurationManager.ApplicationPaths.DefaultUserViewsPath;
if (userPath.Equals(defaultPath, StringComparison.OrdinalIgnoreCase))
{
diff --git a/MediaBrowser.Controller/IO/DirectoryWatchers.cs b/MediaBrowser.Controller/IO/DirectoryWatchers.cs
index 991e4ba430..5789c0240a 100644
--- a/MediaBrowser.Controller/IO/DirectoryWatchers.cs
+++ b/MediaBrowser.Controller/IO/DirectoryWatchers.cs
@@ -1,5 +1,5 @@
-using MediaBrowser.Common.IO;
-using MediaBrowser.Common.ScheduledTasks;
+using MediaBrowser.Common.ScheduledTasks;
+using MediaBrowser.Controller.Configuration;
using MediaBrowser.Controller.Entities;
using MediaBrowser.Controller.Library;
using MediaBrowser.Controller.ScheduledTasks;
@@ -74,16 +74,13 @@ namespace MediaBrowser.Controller.IO
private ITaskManager TaskManager { get; set; }
private ILibraryManager LibraryManager { get; set; }
+ private IServerConfigurationManager ConfigurationManager { get; set; }
///
/// Initializes a new instance of the class.
///
- public DirectoryWatchers(ILogger logger, ITaskManager taskManager, ILibraryManager libraryManager)
+ public DirectoryWatchers(ILogManager logManager, ITaskManager taskManager, ILibraryManager libraryManager, IServerConfigurationManager configurationManager)
{
- if (logger == null)
- {
- throw new ArgumentNullException("logger");
- }
if (taskManager == null)
{
throw new ArgumentNullException("taskManager");
@@ -91,7 +88,8 @@ namespace MediaBrowser.Controller.IO
LibraryManager = libraryManager;
TaskManager = taskManager;
- Logger = logger;
+ Logger = logManager.GetLogger("DirectoryWatchers");
+ ConfigurationManager = configurationManager;
}
///
@@ -335,11 +333,11 @@ namespace MediaBrowser.Controller.IO
{
if (updateTimer == null)
{
- updateTimer = new Timer(TimerStopped, null, TimeSpan.FromSeconds(Kernel.Instance.Configuration.FileWatcherDelay), TimeSpan.FromMilliseconds(-1));
+ updateTimer = new Timer(TimerStopped, null, TimeSpan.FromSeconds(ConfigurationManager.Configuration.FileWatcherDelay), TimeSpan.FromMilliseconds(-1));
}
else
{
- updateTimer.Change(TimeSpan.FromSeconds(Kernel.Instance.Configuration.FileWatcherDelay), TimeSpan.FromMilliseconds(-1));
+ updateTimer.Change(TimeSpan.FromSeconds(ConfigurationManager.Configuration.FileWatcherDelay), TimeSpan.FromMilliseconds(-1));
}
}
}
@@ -356,7 +354,7 @@ namespace MediaBrowser.Controller.IO
if (affectedPaths.Any(p => IsFileLocked(p.Key)))
{
Logger.Info("Timer extended.");
- updateTimer.Change(TimeSpan.FromSeconds(Kernel.Instance.Configuration.FileWatcherDelay), TimeSpan.FromMilliseconds(-1));
+ updateTimer.Change(TimeSpan.FromSeconds(ConfigurationManager.Configuration.FileWatcherDelay), TimeSpan.FromMilliseconds(-1));
return;
}
diff --git a/MediaBrowser.Controller/IO/FileSystemManager.cs b/MediaBrowser.Controller/IO/FileSystemManager.cs
index b1695e7b5e..4afc8265fc 100644
--- a/MediaBrowser.Controller/IO/FileSystemManager.cs
+++ b/MediaBrowser.Controller/IO/FileSystemManager.cs
@@ -1,6 +1,7 @@
using MediaBrowser.Common.IO;
using MediaBrowser.Common.Kernel;
using MediaBrowser.Common.ScheduledTasks;
+using MediaBrowser.Controller.Configuration;
using MediaBrowser.Controller.Entities;
using MediaBrowser.Controller.Library;
using MediaBrowser.Model.Logging;
@@ -33,14 +34,15 @@ namespace MediaBrowser.Controller.IO
/// Initializes a new instance of the class.
///
/// The kernel.
- /// The logger.
+ /// The log manager.
/// The task manager.
/// The library manager.
- public FileSystemManager(Kernel kernel, ILogger logger, ITaskManager taskManager, ILibraryManager libraryManager)
+ /// The configuration manager.
+ public FileSystemManager(Kernel kernel, ILogManager logManager, ITaskManager taskManager, ILibraryManager libraryManager, IServerConfigurationManager configurationManager)
: base(kernel)
{
- _logger = logger;
- DirectoryWatchers = new DirectoryWatchers(logger, taskManager, libraryManager);
+ _logger = logManager.GetLogger("FileSystemManager");
+ DirectoryWatchers = new DirectoryWatchers(logManager, taskManager, libraryManager, configurationManager);
}
///
diff --git a/MediaBrowser.Controller/IServerApplicationPaths.cs b/MediaBrowser.Controller/IServerApplicationPaths.cs
index b5fcdef285..b30120d835 100644
--- a/MediaBrowser.Controller/IServerApplicationPaths.cs
+++ b/MediaBrowser.Controller/IServerApplicationPaths.cs
@@ -1,4 +1,5 @@
-using MediaBrowser.Common.Kernel;
+using MediaBrowser.Common.Configuration;
+using MediaBrowser.Common.Kernel;
namespace MediaBrowser.Controller
{
diff --git a/MediaBrowser.Controller/Kernel.cs b/MediaBrowser.Controller/Kernel.cs
index 5dbb53d0ae..9f97b1719a 100644
--- a/MediaBrowser.Controller/Kernel.cs
+++ b/MediaBrowser.Controller/Kernel.cs
@@ -1,5 +1,7 @@
-using MediaBrowser.Common.Kernel;
+using MediaBrowser.Common;
+using MediaBrowser.Common.Kernel;
using MediaBrowser.Common.ScheduledTasks;
+using MediaBrowser.Controller.Configuration;
using MediaBrowser.Controller.Drawing;
using MediaBrowser.Controller.Entities;
using MediaBrowser.Controller.IO;
@@ -11,7 +13,6 @@ using MediaBrowser.Controller.Plugins;
using MediaBrowser.Controller.Providers;
using MediaBrowser.Controller.Updates;
using MediaBrowser.Controller.Weather;
-using MediaBrowser.Model.Configuration;
using MediaBrowser.Model.Logging;
using MediaBrowser.Model.Serialization;
using MediaBrowser.Model.System;
@@ -26,7 +27,7 @@ namespace MediaBrowser.Controller
///
/// Class Kernel
///
- public class Kernel : BaseKernel
+ public class Kernel : BaseKernel, IDisposable
{
///
/// Gets the instance.
@@ -161,23 +162,34 @@ namespace MediaBrowser.Controller
get { return 7359; }
}
+ private readonly IXmlSerializer _xmlSerializer;
+
+ private readonly IServerConfigurationManager _configurationManager;
+ private readonly ILogManager _logManager;
+
///
/// Creates a kernel based on a Data path, which is akin to our current programdata path
///
/// The app host.
- /// The app paths.
/// The XML serializer.
- /// The logger.
+ /// The log manager.
+ /// The configuration manager.
/// isoManager
- public Kernel(IApplicationHost appHost, IServerApplicationPaths appPaths, IXmlSerializer xmlSerializer, ILogger logger)
- : base(appHost, appPaths, xmlSerializer, logger)
+ public Kernel(IApplicationHost appHost, IXmlSerializer xmlSerializer, ILogManager logManager, IServerConfigurationManager configurationManager)
+ : base(appHost, logManager, configurationManager)
{
Instance = this;
- // For now there's no real way to inject this properly
- BaseItem.Logger = logger;
- Ratings.Logger = logger;
- LocalizedStrings.Logger = logger;
+ _configurationManager = configurationManager;
+ _xmlSerializer = xmlSerializer;
+ _logManager = logManager;
+
+ // For now there's no real way to inject these properly
+ BaseItem.Logger = logManager.GetLogger("BaseItem");
+ User.XmlSerializer = _xmlSerializer;
+ Ratings.ConfigurationManager = _configurationManager;
+ LocalizedStrings.ApplicationPaths = _configurationManager.ApplicationPaths;
+ BaseItem.ConfigurationManager = configurationManager;
}
///
@@ -185,14 +197,13 @@ namespace MediaBrowser.Controller
///
protected void FindParts()
{
- // For now there's no real way to inject this properly
+ // For now there's no real way to inject these properly
BaseItem.LibraryManager = ApplicationHost.Resolve();
User.UserManager = ApplicationHost.Resolve();
FFMpegManager = (FFMpegManager)ApplicationHost.CreateInstance(typeof(FFMpegManager));
ImageManager = (ImageManager)ApplicationHost.CreateInstance(typeof(ImageManager));
ProviderManager = (ProviderManager)ApplicationHost.CreateInstance(typeof(ProviderManager));
- SecurityManager = (PluginSecurityManager)ApplicationHost.CreateInstance(typeof(PluginSecurityManager));
UserDataRepositories = ApplicationHost.GetExports();
UserRepositories = ApplicationHost.GetExports();
@@ -217,8 +228,6 @@ namespace MediaBrowser.Controller
await LoadRepositories().ConfigureAwait(false);
- ReloadResourcePools();
-
await ApplicationHost.Resolve().RefreshUsersMetadata(CancellationToken.None).ConfigureAwait(false);
foreach (var entryPoint in ApplicationHost.GetExports())
@@ -229,41 +238,25 @@ namespace MediaBrowser.Controller
ReloadFileSystemManager();
}
+ ///
+ /// Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources.
+ ///
+ public void Dispose()
+ {
+ Dispose(true);
+ GC.SuppressFinalize(this);
+ }
+
///
/// Releases unmanaged and - optionally - managed resources.
///
/// true to release both managed and unmanaged resources; false to release only unmanaged resources.
- protected override void Dispose(bool dispose)
+ protected virtual void Dispose(bool dispose)
{
if (dispose)
{
- DisposeResourcePools();
-
DisposeFileSystemManager();
}
-
- base.Dispose(dispose);
- }
-
- ///
- /// Disposes the resource pools.
- ///
- private void DisposeResourcePools()
- {
- if (ResourcePools != null)
- {
- ResourcePools.Dispose();
- ResourcePools = null;
- }
- }
-
- ///
- /// Reloads the resource pools.
- ///
- private void ReloadResourcePools()
- {
- DisposeResourcePools();
- ResourcePools = new ResourcePool();
}
///
@@ -273,19 +266,19 @@ namespace MediaBrowser.Controller
protected Task LoadRepositories()
{
// Get the current item repository
- ItemRepository = GetRepository(ItemRepositories, Configuration.ItemRepository);
+ ItemRepository = GetRepository(ItemRepositories, _configurationManager.Configuration.ItemRepository);
var itemRepoTask = ItemRepository.Initialize();
// Get the current user repository
- UserRepository = GetRepository(UserRepositories, Configuration.UserRepository);
+ UserRepository = GetRepository(UserRepositories, _configurationManager.Configuration.UserRepository);
var userRepoTask = UserRepository.Initialize();
// Get the current item repository
- UserDataRepository = GetRepository(UserDataRepositories, Configuration.UserDataRepository);
+ UserDataRepository = GetRepository(UserDataRepositories, _configurationManager.Configuration.UserDataRepository);
var userDataRepoTask = UserDataRepository.Initialize();
// Get the current display preferences repository
- DisplayPreferencesRepository = GetRepository(DisplayPreferencesRepositories, Configuration.DisplayPreferencesRepository);
+ DisplayPreferencesRepository = GetRepository(DisplayPreferencesRepositories, _configurationManager.Configuration.DisplayPreferencesRepository);
var displayPreferencesRepoTask = DisplayPreferencesRepository.Initialize();
return Task.WhenAll(itemRepoTask, userRepoTask, userDataRepoTask, displayPreferencesRepoTask);
@@ -326,26 +319,10 @@ namespace MediaBrowser.Controller
{
DisposeFileSystemManager();
- FileSystemManager = new FileSystemManager(this, Logger, ApplicationHost.Resolve(), ApplicationHost.Resolve());
+ FileSystemManager = new FileSystemManager(this, _logManager, ApplicationHost.Resolve(), ApplicationHost.Resolve(), _configurationManager);
FileSystemManager.StartWatchers();
}
- ///
- /// Completely overwrites the current configuration with a new copy
- ///
- /// The config.
- public void UpdateConfiguration(ServerConfiguration config)
- {
- Configuration = config;
- SaveConfiguration();
-
- // Validate currently executing providers, in the background
- Task.Run(() =>
- {
- ProviderManager.ValidateCurrentlyRunningProviders();
- });
- }
-
///
/// Gets the system info.
///
diff --git a/MediaBrowser.Controller/Library/DtoBuilder.cs b/MediaBrowser.Controller/Library/DtoBuilder.cs
index 0a892cbfb8..0b14bb9522 100644
--- a/MediaBrowser.Controller/Library/DtoBuilder.cs
+++ b/MediaBrowser.Controller/Library/DtoBuilder.cs
@@ -474,14 +474,8 @@ namespace MediaBrowser.Controller.Library
/// The dto.
private static void SetSpecialCounts(Folder folder, User user, BaseItemDto dto)
{
- var utcNow = DateTime.UtcNow;
-
var rcentlyAddedItemCount = 0;
var recursiveItemCount = 0;
- var favoriteItemsCount = 0;
- var recentlyAddedUnPlayedItemCount = 0;
- var resumableItemCount = 0;
- var recentlyPlayedItemCount = 0;
double totalPercentPlayed = 0;
@@ -498,12 +492,6 @@ namespace MediaBrowser.Controller.Library
if (child.IsRecentlyAdded(user))
{
rcentlyAddedItemCount++;
-
- // Check recently added unplayed
- if (userdata == null || userdata.PlayCount == 0)
- {
- recentlyAddedUnPlayedItemCount++;
- }
}
// Incrememt totalPercentPlayed
@@ -521,32 +509,10 @@ namespace MediaBrowser.Controller.Library
}
}
}
-
- if (userdata != null)
- {
- if (userdata.IsFavorite)
- {
- favoriteItemsCount++;
- }
-
- if (userdata.PlaybackPositionTicks > 0)
- {
- resumableItemCount++;
- }
-
- if (userdata.LastPlayedDate.HasValue && (utcNow - userdata.LastPlayedDate.Value).TotalDays < Kernel.Instance.Configuration.RecentlyPlayedDays)
- {
- recentlyPlayedItemCount++;
- }
- }
}
dto.RecursiveItemCount = recursiveItemCount;
dto.RecentlyAddedItemCount = rcentlyAddedItemCount;
- dto.RecentlyAddedUnPlayedItemCount = recentlyAddedUnPlayedItemCount;
- dto.ResumableItemCount = resumableItemCount;
- dto.FavoriteItemCount = favoriteItemsCount;
- dto.RecentlyPlayedItemCount = recentlyPlayedItemCount;
if (recursiveItemCount > 0)
{
diff --git a/MediaBrowser.Controller/Library/ItemResolveArgs.cs b/MediaBrowser.Controller/Library/ItemResolveArgs.cs
index 0979c6845c..2dbbc9d83c 100644
--- a/MediaBrowser.Controller/Library/ItemResolveArgs.cs
+++ b/MediaBrowser.Controller/Library/ItemResolveArgs.cs
@@ -1,9 +1,9 @@
using MediaBrowser.Controller.Entities;
+using MediaBrowser.Controller.IO;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
-using MediaBrowser.Controller.IO;
namespace MediaBrowser.Controller.Library
{
@@ -13,6 +13,20 @@ namespace MediaBrowser.Controller.Library
///
public class ItemResolveArgs : EventArgs
{
+ ///
+ /// The _app paths
+ ///
+ private readonly IServerApplicationPaths _appPaths;
+
+ ///
+ /// Initializes a new instance of the class.
+ ///
+ /// The app paths.
+ public ItemResolveArgs(IServerApplicationPaths appPaths)
+ {
+ _appPaths = appPaths;
+ }
+
///
/// Gets the file system children.
///
@@ -99,9 +113,9 @@ namespace MediaBrowser.Controller.Library
}
var parentDir = FileInfo.Path != null ? System.IO.Path.GetDirectoryName(FileInfo.Path) ?? string.Empty : string.Empty;
-
- return (parentDir.Length > Kernel.Instance.ApplicationPaths.RootFolderPath.Length
- && parentDir.StartsWith(Kernel.Instance.ApplicationPaths.RootFolderPath, StringComparison.OrdinalIgnoreCase));
+
+ return (parentDir.Length > _appPaths.RootFolderPath.Length
+ && parentDir.StartsWith(_appPaths.RootFolderPath, StringComparison.OrdinalIgnoreCase));
}
}
@@ -114,7 +128,7 @@ namespace MediaBrowser.Controller.Library
{
get
{
- return IsDirectory && Path.Equals(Kernel.Instance.ApplicationPaths.RootFolderPath, StringComparison.OrdinalIgnoreCase);
+ return IsDirectory && Path.Equals(_appPaths.RootFolderPath, StringComparison.OrdinalIgnoreCase);
}
}
diff --git a/MediaBrowser.Controller/Localization/LocalizedStrings.cs b/MediaBrowser.Controller/Localization/LocalizedStrings.cs
index 0d583641bd..c7f4755b73 100644
--- a/MediaBrowser.Controller/Localization/LocalizedStrings.cs
+++ b/MediaBrowser.Controller/Localization/LocalizedStrings.cs
@@ -1,4 +1,5 @@
-using MediaBrowser.Model.Logging;
+using MediaBrowser.Controller.Configuration;
+using MediaBrowser.Model.Logging;
using System;
using System.Collections.Concurrent;
using System.Globalization;
@@ -14,10 +15,8 @@ namespace MediaBrowser.Controller.Localization
///
public class LocalizedStrings
{
- ///
- /// The logger
- ///
- static internal ILogger Logger { get; set; }
+ internal static IServerApplicationPaths ApplicationPaths;
+
///
/// The base prefix
///
@@ -31,17 +30,21 @@ namespace MediaBrowser.Controller.Localization
///
private static LocalizedStrings _instance;
+ private IServerApplicationPaths _appPaths;
+
///
/// Gets the instance.
///
/// The instance.
- public static LocalizedStrings Instance { get { return _instance ?? (_instance = new LocalizedStrings()); } }
+ public static LocalizedStrings Instance { get { return _instance ?? (_instance = new LocalizedStrings(ApplicationPaths)); } }
///
/// Initializes a new instance of the class.
///
- public LocalizedStrings()
+ public LocalizedStrings(IServerApplicationPaths appPaths)
{
+ _appPaths = appPaths;
+
foreach (var stringObject in Kernel.Instance.StringFiles)
{
AddStringData(LoadFromFile(GetFileName(stringObject),stringObject.GetType()));
@@ -55,7 +58,7 @@ namespace MediaBrowser.Controller.Localization
/// System.String.
protected string GetFileName(LocalizedStringData stringObject)
{
- var path = Kernel.Instance.ApplicationPaths.LocalizationPath;
+ var path = _appPaths.LocalizationPath;
var name = Path.Combine(path, stringObject.Prefix + "strings-" + CultureInfo.CurrentCulture + ".xml");
if (File.Exists(name))
{
@@ -125,17 +128,17 @@ namespace MediaBrowser.Controller.Localization
}
catch (TargetException ex)
{
- Logger.ErrorException("Error getting value for field: {0}", ex, field.Name);
+ //Logger.ErrorException("Error getting value for field: {0}", ex, field.Name);
continue;
}
catch (FieldAccessException ex)
{
- Logger.ErrorException("Error getting value for field: {0}", ex, field.Name);
+ //Logger.ErrorException("Error getting value for field: {0}", ex, field.Name);
continue;
}
catch (NotSupportedException ex)
{
- Logger.ErrorException("Error getting value for field: {0}", ex, field.Name);
+ //Logger.ErrorException("Error getting value for field: {0}", ex, field.Name);
continue;
}
diff --git a/MediaBrowser.Controller/Localization/Ratings.cs b/MediaBrowser.Controller/Localization/Ratings.cs
index 46368a250a..bee7b6e557 100644
--- a/MediaBrowser.Controller/Localization/Ratings.cs
+++ b/MediaBrowser.Controller/Localization/Ratings.cs
@@ -1,4 +1,5 @@
using MediaBrowser.Common.Extensions;
+using MediaBrowser.Controller.Configuration;
using MediaBrowser.Model.Logging;
using System.Collections.Generic;
using System.IO;
@@ -11,7 +12,8 @@ namespace MediaBrowser.Controller.Localization
///
public static class Ratings
{
- static internal ILogger Logger { get; set; }
+ internal static IServerConfigurationManager ConfigurationManager;
+
///
/// The ratings def
///
@@ -26,7 +28,7 @@ namespace MediaBrowser.Controller.Localization
/// The ratings dict.
public static Dictionary RatingsDict
{
- get { return _ratingsDict ?? (_ratingsDict = Initialize(false)); }
+ get { return _ratingsDict ?? (_ratingsDict = Initialize(false, ConfigurationManager)); }
}
///
/// The ratings strings
@@ -38,17 +40,17 @@ namespace MediaBrowser.Controller.Localization
///
/// if set to true [block unrated].
/// Dictionary{System.StringSystem.Int32}.
- public static Dictionary Initialize(bool blockUnrated)
+ public static Dictionary Initialize(bool blockUnrated, IServerConfigurationManager configurationManager)
{
//build our ratings dictionary from the combined local one and us one
- ratingsDef = new RatingsDefinition(Path.Combine(Kernel.Instance.ApplicationPaths.LocalizationPath, "Ratings-" + Kernel.Instance.Configuration.MetadataCountryCode + ".txt"), Logger);
+ ratingsDef = new RatingsDefinition(Path.Combine(configurationManager.ApplicationPaths.LocalizationPath, "Ratings-" + configurationManager.Configuration.MetadataCountryCode + ".txt"), configurationManager);
//global value of None
var dict = new Dictionary {{"None", -1}};
foreach (var pair in ratingsDef.RatingsDict)
{
dict.TryAdd(pair.Key, pair.Value);
}
- if (Kernel.Instance.Configuration.MetadataCountryCode.ToUpper() != "US")
+ if (configurationManager.Configuration.MetadataCountryCode.ToUpper() != "US")
{
foreach (var pair in new USRatingsDictionary())
{
diff --git a/MediaBrowser.Controller/Localization/RatingsDefinition.cs b/MediaBrowser.Controller/Localization/RatingsDefinition.cs
index e0753da2e0..1162d2389f 100644
--- a/MediaBrowser.Controller/Localization/RatingsDefinition.cs
+++ b/MediaBrowser.Controller/Localization/RatingsDefinition.cs
@@ -1,4 +1,5 @@
-using MediaBrowser.Model.Logging;
+using MediaBrowser.Controller.Configuration;
+using MediaBrowser.Model.Logging;
using System;
using System.Collections.Generic;
using System.IO;
@@ -10,26 +11,18 @@ namespace MediaBrowser.Controller.Localization
///
public class RatingsDefinition
{
- ///
- /// Gets or sets the logger.
- ///
- /// The logger.
- private ILogger Logger { get; set; }
-
///
/// Initializes a new instance of the class.
///
/// The file.
/// The logger.
- public RatingsDefinition(string file, ILogger logger)
+ /// The configuration manager.
+ public RatingsDefinition(string file, IServerConfigurationManager configurationManager)
{
- Logger = logger;
-
- Logger.Info("Loading Certification Ratings from file " + file);
this.file = file;
if (!Load())
{
- Init(Kernel.Instance.Configuration.MetadataCountryCode.ToUpper());
+ Init(configurationManager.Configuration.MetadataCountryCode.ToUpper());
}
}
@@ -108,7 +101,7 @@ namespace MediaBrowser.Controller.Localization
}
else
{
- Logger.Error("Invalid line in ratings file " + file + "(" + line + ")");
+ //Logger.Error("Invalid line in ratings file " + file + "(" + line + ")");
}
}
}
diff --git a/MediaBrowser.Controller/MediaBrowser.Controller.csproj b/MediaBrowser.Controller/MediaBrowser.Controller.csproj
index 319289f94a..f4be79afb1 100644
--- a/MediaBrowser.Controller/MediaBrowser.Controller.csproj
+++ b/MediaBrowser.Controller/MediaBrowser.Controller.csproj
@@ -53,9 +53,6 @@
MinimumRecommendedRules.ruleset
-
- Plugins\Mediabrowser.PluginSecurity.dll
-
False
..\packages\protobuf-net.2.0.0.621\lib\net40\protobuf-net.dll
@@ -74,6 +71,7 @@
Properties\SharedVersion.cs
+
@@ -135,7 +133,6 @@
-
diff --git a/MediaBrowser.Controller/MediaInfo/FFMpegManager.cs b/MediaBrowser.Controller/MediaInfo/FFMpegManager.cs
index 0f535208b4..36fab24bb1 100644
--- a/MediaBrowser.Controller/MediaInfo/FFMpegManager.cs
+++ b/MediaBrowser.Controller/MediaInfo/FFMpegManager.cs
@@ -67,6 +67,7 @@ namespace MediaBrowser.Controller.MediaInfo
/// The _protobuf serializer
///
private readonly IProtobufSerializer _protobufSerializer;
+ private readonly IServerApplicationPaths _appPaths;
///
/// Initializes a new instance of the class.
@@ -77,7 +78,7 @@ namespace MediaBrowser.Controller.MediaInfo
/// The protobuf serializer.
/// The logger.
/// zipClient
- public FFMpegManager(Kernel kernel, IZipClient zipClient, IJsonSerializer jsonSerializer, IProtobufSerializer protobufSerializer, ILogger logger)
+ public FFMpegManager(Kernel kernel, IZipClient zipClient, IJsonSerializer jsonSerializer, IProtobufSerializer protobufSerializer, ILogManager logManager, IServerApplicationPaths appPaths)
{
if (kernel == null)
{
@@ -95,16 +96,13 @@ namespace MediaBrowser.Controller.MediaInfo
{
throw new ArgumentNullException("protobufSerializer");
}
- if (logger == null)
- {
- throw new ArgumentNullException("logger");
- }
_kernel = kernel;
_zipClient = zipClient;
_jsonSerializer = jsonSerializer;
_protobufSerializer = protobufSerializer;
- _logger = logger;
+ _appPaths = appPaths;
+ _logger = logManager.GetLogger("FFMpegManager");
// Not crazy about this but it's the only way to suppress ffmpeg crash dialog boxes
SetErrorMode(ErrorModes.SEM_FAILCRITICALERRORS | ErrorModes.SEM_NOALIGNMENTFAULTEXCEPT | ErrorModes.SEM_NOGPFAULTERRORBOX | ErrorModes.SEM_NOOPENFILEERRORBOX);
@@ -223,7 +221,7 @@ namespace MediaBrowser.Controller.MediaInfo
{
if (_videoImagesDataPath == null)
{
- _videoImagesDataPath = Path.Combine(_kernel.ApplicationPaths.DataPath, "ffmpeg-video-images");
+ _videoImagesDataPath = Path.Combine(_appPaths.DataPath, "ffmpeg-video-images");
if (!Directory.Exists(_videoImagesDataPath))
{
@@ -249,7 +247,7 @@ namespace MediaBrowser.Controller.MediaInfo
{
if (_audioImagesDataPath == null)
{
- _audioImagesDataPath = Path.Combine(_kernel.ApplicationPaths.DataPath, "ffmpeg-audio-images");
+ _audioImagesDataPath = Path.Combine(_appPaths.DataPath, "ffmpeg-audio-images");
if (!Directory.Exists(_audioImagesDataPath))
{
@@ -275,7 +273,7 @@ namespace MediaBrowser.Controller.MediaInfo
{
if (_subtitleCachePath == null)
{
- _subtitleCachePath = Path.Combine(_kernel.ApplicationPaths.CachePath, "ffmpeg-subtitles");
+ _subtitleCachePath = Path.Combine(_appPaths.CachePath, "ffmpeg-subtitles");
if (!Directory.Exists(_subtitleCachePath))
{
@@ -302,7 +300,7 @@ namespace MediaBrowser.Controller.MediaInfo
var filename = resource.Substring(resource.IndexOf(prefix, StringComparison.OrdinalIgnoreCase) + prefix.Length);
- var versionedDirectoryPath = Path.Combine(_kernel.ApplicationPaths.MediaToolsPath, Path.GetFileNameWithoutExtension(filename));
+ var versionedDirectoryPath = Path.Combine(_appPaths.MediaToolsPath, Path.GetFileNameWithoutExtension(filename));
if (!Directory.Exists(versionedDirectoryPath))
{
diff --git a/MediaBrowser.Controller/Providers/BaseMetadataProvider.cs b/MediaBrowser.Controller/Providers/BaseMetadataProvider.cs
index f6c6ed3036..a5823c60e2 100644
--- a/MediaBrowser.Controller/Providers/BaseMetadataProvider.cs
+++ b/MediaBrowser.Controller/Providers/BaseMetadataProvider.cs
@@ -1,4 +1,6 @@
-using MediaBrowser.Common.Extensions;
+using MediaBrowser.Common.Configuration;
+using MediaBrowser.Common.Extensions;
+using MediaBrowser.Controller.Configuration;
using MediaBrowser.Controller.Entities;
using MediaBrowser.Model.Logging;
using System;
@@ -19,6 +21,12 @@ namespace MediaBrowser.Controller.Providers
protected ILogger Logger { get; set; }
protected ILogManager LogManager { get; set; }
+ ///
+ /// Gets the configuration manager.
+ ///
+ /// The configuration manager.
+ protected IServerConfigurationManager ConfigurationManager { get; private set; }
+
// Cache these since they will be used a lot
///
/// The false task result
@@ -103,10 +111,11 @@ namespace MediaBrowser.Controller.Providers
///
/// Initializes a new instance of the class.
///
- protected BaseMetadataProvider(ILogManager logManager)
+ protected BaseMetadataProvider(ILogManager logManager, IServerConfigurationManager configurationManager)
{
Logger = logManager.GetLogger(GetType().Name);
LogManager = logManager;
+ ConfigurationManager = configurationManager;
Initialize();
}
diff --git a/MediaBrowser.Controller/Providers/FanartBaseProvider.cs b/MediaBrowser.Controller/Providers/FanartBaseProvider.cs
index 7a38fbb7a8..548fbd5a69 100644
--- a/MediaBrowser.Controller/Providers/FanartBaseProvider.cs
+++ b/MediaBrowser.Controller/Providers/FanartBaseProvider.cs
@@ -1,4 +1,5 @@
-using MediaBrowser.Controller.Entities;
+using MediaBrowser.Controller.Configuration;
+using MediaBrowser.Controller.Entities;
using System;
using MediaBrowser.Model.Logging;
@@ -35,7 +36,7 @@ namespace MediaBrowser.Controller.Providers
///
protected const string APIKey = "5c6b04c68e904cfed1e6cbc9a9e683d4";
- protected FanartBaseProvider(ILogManager logManager) : base(logManager)
+ protected FanartBaseProvider(ILogManager logManager, IServerConfigurationManager configurationManager) : base(logManager, configurationManager)
{
}
@@ -49,7 +50,7 @@ namespace MediaBrowser.Controller.Providers
{
if (item.DontFetchMeta) return false;
- return DateTime.UtcNow > (providerInfo.LastRefreshed.AddDays(Kernel.Instance.Configuration.MetadataRefreshDays))
+ return DateTime.UtcNow > (providerInfo.LastRefreshed.AddDays(ConfigurationManager.Configuration.MetadataRefreshDays))
&& ShouldFetch(item, providerInfo);
}
diff --git a/MediaBrowser.Controller/Providers/FolderProviderFromXml.cs b/MediaBrowser.Controller/Providers/FolderProviderFromXml.cs
index 1baa1ed558..45a47a58da 100644
--- a/MediaBrowser.Controller/Providers/FolderProviderFromXml.cs
+++ b/MediaBrowser.Controller/Providers/FolderProviderFromXml.cs
@@ -1,4 +1,5 @@
-using MediaBrowser.Controller.Entities;
+using MediaBrowser.Controller.Configuration;
+using MediaBrowser.Controller.Entities;
using MediaBrowser.Model.Entities;
using System;
using System.IO;
@@ -13,7 +14,7 @@ namespace MediaBrowser.Controller.Providers
///
public class FolderProviderFromXml : BaseMetadataProvider
{
- public FolderProviderFromXml(ILogManager logManager) : base(logManager)
+ public FolderProviderFromXml(ILogManager logManager, IServerConfigurationManager configurationManager) : base(logManager, configurationManager)
{
}
diff --git a/MediaBrowser.Controller/Providers/ImageFromMediaLocationProvider.cs b/MediaBrowser.Controller/Providers/ImageFromMediaLocationProvider.cs
index ddf9e3334c..4b337aadce 100644
--- a/MediaBrowser.Controller/Providers/ImageFromMediaLocationProvider.cs
+++ b/MediaBrowser.Controller/Providers/ImageFromMediaLocationProvider.cs
@@ -1,4 +1,5 @@
-using MediaBrowser.Controller.Entities;
+using MediaBrowser.Controller.Configuration;
+using MediaBrowser.Controller.Entities;
using MediaBrowser.Controller.IO;
using MediaBrowser.Model.Entities;
using System;
@@ -16,7 +17,7 @@ namespace MediaBrowser.Controller.Providers
///
public class ImageFromMediaLocationProvider : BaseMetadataProvider
{
- public ImageFromMediaLocationProvider(ILogManager logManager) : base(logManager)
+ public ImageFromMediaLocationProvider(ILogManager logManager, IServerConfigurationManager configurationManager) : base(logManager, configurationManager)
{
}
diff --git a/MediaBrowser.Controller/Providers/ImagesByNameProvider.cs b/MediaBrowser.Controller/Providers/ImagesByNameProvider.cs
index 1521b514ce..53ff94720e 100644
--- a/MediaBrowser.Controller/Providers/ImagesByNameProvider.cs
+++ b/MediaBrowser.Controller/Providers/ImagesByNameProvider.cs
@@ -1,4 +1,5 @@
-using MediaBrowser.Controller.Entities;
+using MediaBrowser.Controller.Configuration;
+using MediaBrowser.Controller.Entities;
using MediaBrowser.Controller.IO;
using System;
using System.Globalization;
@@ -13,7 +14,7 @@ namespace MediaBrowser.Controller.Providers
///
public class ImagesByNameProvider : ImageFromMediaLocationProvider
{
- public ImagesByNameProvider(ILogManager logManager) : base(logManager)
+ public ImagesByNameProvider(ILogManager logManager, IServerConfigurationManager configurationManager) : base(logManager, configurationManager)
{
}
@@ -82,7 +83,7 @@ namespace MediaBrowser.Controller.Providers
var name = item.Name ?? string.Empty;
name = invalid.Aggregate(name, (current, c) => current.Replace(c.ToString(UsCulture), string.Empty));
- return Path.Combine(Kernel.Instance.ApplicationPaths.GeneralPath, name);
+ return Path.Combine(ConfigurationManager.ApplicationPaths.GeneralPath, name);
}
///
diff --git a/MediaBrowser.Controller/Providers/MediaInfo/BaseFFMpegImageProvider.cs b/MediaBrowser.Controller/Providers/MediaInfo/BaseFFMpegImageProvider.cs
index 8ca080e9b8..902fdca27b 100644
--- a/MediaBrowser.Controller/Providers/MediaInfo/BaseFFMpegImageProvider.cs
+++ b/MediaBrowser.Controller/Providers/MediaInfo/BaseFFMpegImageProvider.cs
@@ -1,4 +1,5 @@
-using MediaBrowser.Controller.Entities;
+using MediaBrowser.Controller.Configuration;
+using MediaBrowser.Controller.Entities;
using MediaBrowser.Model.Logging;
namespace MediaBrowser.Controller.Providers.MediaInfo
@@ -6,7 +7,7 @@ namespace MediaBrowser.Controller.Providers.MediaInfo
public abstract class BaseFFMpegImageProvider : BaseFFMpegProvider
where T : BaseItem
{
- protected BaseFFMpegImageProvider(ILogManager logManager) : base(logManager)
+ protected BaseFFMpegImageProvider(ILogManager logManager, IServerConfigurationManager configurationManager) : base(logManager, configurationManager)
{
}
diff --git a/MediaBrowser.Controller/Providers/MediaInfo/BaseFFMpegProvider.cs b/MediaBrowser.Controller/Providers/MediaInfo/BaseFFMpegProvider.cs
index e3f0d16a74..20f59b22de 100644
--- a/MediaBrowser.Controller/Providers/MediaInfo/BaseFFMpegProvider.cs
+++ b/MediaBrowser.Controller/Providers/MediaInfo/BaseFFMpegProvider.cs
@@ -1,4 +1,5 @@
using MediaBrowser.Common.IO;
+using MediaBrowser.Controller.Configuration;
using MediaBrowser.Controller.Entities;
using MediaBrowser.Model.Entities;
using System;
@@ -14,7 +15,7 @@ namespace MediaBrowser.Controller.Providers.MediaInfo
public abstract class BaseFFMpegProvider : BaseMetadataProvider
where T : BaseItem
{
- protected BaseFFMpegProvider(ILogManager logManager) : base(logManager)
+ protected BaseFFMpegProvider(ILogManager logManager, IServerConfigurationManager configurationManager) : base(logManager, configurationManager)
{
}
diff --git a/MediaBrowser.Controller/Providers/MediaInfo/BaseFFProbeProvider.cs b/MediaBrowser.Controller/Providers/MediaInfo/BaseFFProbeProvider.cs
index e0633d97dd..9fe2a6c01f 100644
--- a/MediaBrowser.Controller/Providers/MediaInfo/BaseFFProbeProvider.cs
+++ b/MediaBrowser.Controller/Providers/MediaInfo/BaseFFProbeProvider.cs
@@ -1,4 +1,5 @@
using MediaBrowser.Common.IO;
+using MediaBrowser.Controller.Configuration;
using MediaBrowser.Controller.Entities;
using MediaBrowser.Controller.MediaInfo;
using MediaBrowser.Controller.Persistence;
@@ -19,7 +20,7 @@ namespace MediaBrowser.Controller.Providers.MediaInfo
public abstract class BaseFFProbeProvider : BaseFFMpegProvider
where T : BaseItem
{
- protected BaseFFProbeProvider(ILogManager logManager) : base(logManager)
+ protected BaseFFProbeProvider(ILogManager logManager, IServerConfigurationManager configurationManager) : base(logManager, configurationManager)
{
}
@@ -35,7 +36,7 @@ namespace MediaBrowser.Controller.Providers.MediaInfo
protected override void Initialize()
{
base.Initialize();
- FFProbeCache = new FileSystemRepository(Path.Combine(Kernel.Instance.ApplicationPaths.CachePath, CacheDirectoryName));
+ FFProbeCache = new FileSystemRepository(Path.Combine(ConfigurationManager.ApplicationPaths.CachePath, CacheDirectoryName));
}
///
diff --git a/MediaBrowser.Controller/Providers/MediaInfo/FFMpegAudioImageProvider.cs b/MediaBrowser.Controller/Providers/MediaInfo/FFMpegAudioImageProvider.cs
index 581cd4e092..aedd035377 100644
--- a/MediaBrowser.Controller/Providers/MediaInfo/FFMpegAudioImageProvider.cs
+++ b/MediaBrowser.Controller/Providers/MediaInfo/FFMpegAudioImageProvider.cs
@@ -1,4 +1,5 @@
-using MediaBrowser.Controller.Entities;
+using MediaBrowser.Controller.Configuration;
+using MediaBrowser.Controller.Entities;
using MediaBrowser.Controller.Entities.Audio;
using MediaBrowser.Model.Entities;
using System;
@@ -14,7 +15,7 @@ namespace MediaBrowser.Controller.Providers.MediaInfo
///
public class FFMpegAudioImageProvider : BaseFFMpegImageProvider
/// The iso manager.
- public FfMpegVideoImageProvider(IIsoManager isoManager, ILogManager logManager)
- : base(logManager)
+ /// The log manager.
+ /// The configuration manager.
+ public FfMpegVideoImageProvider(IIsoManager isoManager, ILogManager logManager, IServerConfigurationManager configurationManager)
+ : base(logManager, configurationManager)
{
_isoManager = isoManager;
}
diff --git a/MediaBrowser.Controller/Providers/MediaInfo/FFProbeAudioInfoProvider.cs b/MediaBrowser.Controller/Providers/MediaInfo/FFProbeAudioInfoProvider.cs
index 3786763861..603b7dcaae 100644
--- a/MediaBrowser.Controller/Providers/MediaInfo/FFProbeAudioInfoProvider.cs
+++ b/MediaBrowser.Controller/Providers/MediaInfo/FFProbeAudioInfoProvider.cs
@@ -1,4 +1,5 @@
using MediaBrowser.Common.IO;
+using MediaBrowser.Controller.Configuration;
using MediaBrowser.Controller.Entities;
using MediaBrowser.Controller.Entities.Audio;
using MediaBrowser.Controller.MediaInfo;
@@ -17,7 +18,7 @@ namespace MediaBrowser.Controller.Providers.MediaInfo
///
public class FFProbeAudioInfoProvider : BaseFFProbeProvider
public class FFProbeVideoInfoProvider : BaseFFProbeProvider
private readonly IProtobufSerializer _protobufSerializer;
- ///
- /// Initializes a new instance of the class.
- ///
- /// The iso manager.
- /// The bluray examiner.
- /// The protobuf serializer.
- /// blurayExaminer
- public FFProbeVideoInfoProvider(IIsoManager isoManager, IBlurayExaminer blurayExaminer, IProtobufSerializer protobufSerializer, ILogManager logManager)
- : base(logManager)
- {
- if (isoManager == null)
- {
- throw new ArgumentNullException("isoManager");
- }
- if (blurayExaminer == null)
- {
- throw new ArgumentNullException("blurayExaminer");
- }
- if (protobufSerializer == null)
- {
- throw new ArgumentNullException("protobufSerializer");
- }
-
- _blurayExaminer = blurayExaminer;
- _isoManager = isoManager;
- _protobufSerializer = protobufSerializer;
-
- BdInfoCache = new FileSystemRepository(Path.Combine(Kernel.Instance.ApplicationPaths.CachePath, "bdinfo"));
- }
-
///
/// Returns true or false indicating if the provider should refresh when the contents of it's directory changes
///
diff --git a/MediaBrowser.Controller/Providers/Movies/FanArtMovieProvider.cs b/MediaBrowser.Controller/Providers/Movies/FanArtMovieProvider.cs
index 434552be38..d307fe0990 100644
--- a/MediaBrowser.Controller/Providers/Movies/FanArtMovieProvider.cs
+++ b/MediaBrowser.Controller/Providers/Movies/FanArtMovieProvider.cs
@@ -1,5 +1,6 @@
using MediaBrowser.Common.Extensions;
using MediaBrowser.Common.Net;
+using MediaBrowser.Controller.Configuration;
using MediaBrowser.Controller.Entities;
using MediaBrowser.Controller.Entities.Movies;
using MediaBrowser.Model.Entities;
@@ -18,14 +19,28 @@ namespace MediaBrowser.Controller.Providers.Movies
///
class FanArtMovieProvider : FanartBaseProvider
{
+ ///
+ /// The fan art
+ ///
+ internal readonly SemaphoreSlim FanArtResourcePool = new SemaphoreSlim(5, 5);
+
+ internal static FanArtMovieProvider Current { get; private set; }
+
///
/// Gets the HTTP client.
///
/// The HTTP client.
protected IHttpClient HttpClient { get; private set; }
- public FanArtMovieProvider(IHttpClient httpClient, ILogManager logManager)
- : base(logManager)
+ ///
+ /// Initializes a new instance of the class.
+ ///
+ /// The HTTP client.
+ /// The log manager.
+ /// The configuration manager.
+ /// httpClient
+ public FanArtMovieProvider(IHttpClient httpClient, ILogManager logManager, IServerConfigurationManager configurationManager)
+ : base(logManager, configurationManager)
{
if (httpClient == null)
{
@@ -34,6 +49,19 @@ namespace MediaBrowser.Controller.Providers.Movies
HttpClient = httpClient;
}
+ ///
+ /// Releases unmanaged and - optionally - managed resources.
+ ///
+ /// true to release both managed and unmanaged resources; false to release only unmanaged resources.
+ protected override void Dispose(bool dispose)
+ {
+ if (dispose)
+ {
+ FanArtResourcePool.Dispose();
+ }
+ base.Dispose(dispose);
+ }
+
///
/// The fan art base URL
///
@@ -63,9 +91,9 @@ namespace MediaBrowser.Controller.Providers.Movies
var logoExists = item.ResolveArgs.ContainsMetaFileByName(LOGO_FILE);
var discExists = item.ResolveArgs.ContainsMetaFileByName(DISC_FILE);
- return (!artExists && Kernel.Instance.Configuration.DownloadMovieArt)
- || (!logoExists && Kernel.Instance.Configuration.DownloadMovieLogo)
- || (!discExists && Kernel.Instance.Configuration.DownloadMovieDisc);
+ return (!artExists && ConfigurationManager.Configuration.DownloadMovieArt)
+ || (!logoExists && ConfigurationManager.Configuration.DownloadMovieLogo)
+ || (!discExists && ConfigurationManager.Configuration.DownloadMovieDisc);
}
///
@@ -82,13 +110,13 @@ namespace MediaBrowser.Controller.Providers.Movies
var movie = item;
if (ShouldFetch(movie, movie.ProviderData.GetValueOrDefault(Id, new BaseProviderInfo { ProviderId = Id })))
{
- var language = Kernel.Instance.Configuration.PreferredMetadataLanguage.ToLower();
+ var language = ConfigurationManager.Configuration.PreferredMetadataLanguage.ToLower();
var url = string.Format(FanArtBaseUrl, APIKey, movie.GetProviderId(MetadataProviders.Tmdb));
var doc = new XmlDocument();
try
{
- using (var xml = await HttpClient.Get(url, Kernel.Instance.ResourcePools.FanArt, cancellationToken).ConfigureAwait(false))
+ using (var xml = await HttpClient.Get(url, FanArtResourcePool, cancellationToken).ConfigureAwait(false))
{
doc.Load(xml);
}
@@ -102,8 +130,8 @@ namespace MediaBrowser.Controller.Providers.Movies
if (doc.HasChildNodes)
{
string path;
- var hd = Kernel.Instance.Configuration.DownloadHDFanArt ? "hd" : "";
- if (Kernel.Instance.Configuration.DownloadMovieLogo && !item.ResolveArgs.ContainsMetaFileByName(LOGO_FILE))
+ var hd = ConfigurationManager.Configuration.DownloadHDFanArt ? "hd" : "";
+ if (ConfigurationManager.Configuration.DownloadMovieLogo && !item.ResolveArgs.ContainsMetaFileByName(LOGO_FILE))
{
var node =
doc.SelectSingleNode("//fanart/movie/movielogos/" + hd + "movielogo[@lang = \"" + language + "\"]/@url") ??
@@ -119,7 +147,7 @@ namespace MediaBrowser.Controller.Providers.Movies
Logger.Debug("FanArtProvider getting ClearLogo for " + movie.Name);
try
{
- movie.SetImage(ImageType.Logo, await Kernel.Instance.ProviderManager.DownloadAndSaveImage(movie, path, LOGO_FILE, Kernel.Instance.ResourcePools.FanArt, cancellationToken).ConfigureAwait(false));
+ movie.SetImage(ImageType.Logo, await Kernel.Instance.ProviderManager.DownloadAndSaveImage(movie, path, LOGO_FILE, FanArtResourcePool, cancellationToken).ConfigureAwait(false));
}
catch (HttpException)
{
@@ -132,7 +160,7 @@ namespace MediaBrowser.Controller.Providers.Movies
}
cancellationToken.ThrowIfCancellationRequested();
- if (Kernel.Instance.Configuration.DownloadMovieArt && !item.ResolveArgs.ContainsMetaFileByName(ART_FILE))
+ if (ConfigurationManager.Configuration.DownloadMovieArt && !item.ResolveArgs.ContainsMetaFileByName(ART_FILE))
{
var node =
doc.SelectSingleNode("//fanart/movie/moviearts/" + hd + "movieart[@lang = \"" + language + "\"]/@url") ??
@@ -145,7 +173,7 @@ namespace MediaBrowser.Controller.Providers.Movies
Logger.Debug("FanArtProvider getting ClearArt for " + movie.Name);
try
{
- movie.SetImage(ImageType.Art, await Kernel.Instance.ProviderManager.DownloadAndSaveImage(movie, path, ART_FILE, Kernel.Instance.ResourcePools.FanArt, cancellationToken).ConfigureAwait(false));
+ movie.SetImage(ImageType.Art, await Kernel.Instance.ProviderManager.DownloadAndSaveImage(movie, path, ART_FILE, FanArtResourcePool, cancellationToken).ConfigureAwait(false));
}
catch (HttpException)
{
@@ -158,7 +186,7 @@ namespace MediaBrowser.Controller.Providers.Movies
}
cancellationToken.ThrowIfCancellationRequested();
- if (Kernel.Instance.Configuration.DownloadMovieDisc && !item.ResolveArgs.ContainsMetaFileByName(DISC_FILE))
+ if (ConfigurationManager.Configuration.DownloadMovieDisc && !item.ResolveArgs.ContainsMetaFileByName(DISC_FILE))
{
var node = doc.SelectSingleNode("//fanart/movie/moviediscs/moviedisc[@lang = \"" + language + "\"]/@url") ??
doc.SelectSingleNode("//fanart/movie/moviediscs/moviedisc/@url");
@@ -168,7 +196,7 @@ namespace MediaBrowser.Controller.Providers.Movies
Logger.Debug("FanArtProvider getting DiscArt for " + movie.Name);
try
{
- movie.SetImage(ImageType.Disc, await Kernel.Instance.ProviderManager.DownloadAndSaveImage(movie, path, DISC_FILE, Kernel.Instance.ResourcePools.FanArt, cancellationToken).ConfigureAwait(false));
+ movie.SetImage(ImageType.Disc, await Kernel.Instance.ProviderManager.DownloadAndSaveImage(movie, path, DISC_FILE, FanArtResourcePool, cancellationToken).ConfigureAwait(false));
}
catch (HttpException)
{
@@ -182,7 +210,7 @@ namespace MediaBrowser.Controller.Providers.Movies
cancellationToken.ThrowIfCancellationRequested();
- if (Kernel.Instance.Configuration.DownloadMovieBanner && !item.ResolveArgs.ContainsMetaFileByName(BANNER_FILE))
+ if (ConfigurationManager.Configuration.DownloadMovieBanner && !item.ResolveArgs.ContainsMetaFileByName(BANNER_FILE))
{
var node = doc.SelectSingleNode("//fanart/movie/moviebanners/moviebanner[@lang = \"" + language + "\"]/@url") ??
doc.SelectSingleNode("//fanart/movie/moviebanners/moviebanner/@url");
@@ -192,7 +220,7 @@ namespace MediaBrowser.Controller.Providers.Movies
Logger.Debug("FanArtProvider getting Banner for " + movie.Name);
try
{
- movie.SetImage(ImageType.Banner, await Kernel.Instance.ProviderManager.DownloadAndSaveImage(movie, path, BANNER_FILE, Kernel.Instance.ResourcePools.FanArt, cancellationToken).ConfigureAwait(false));
+ movie.SetImage(ImageType.Banner, await Kernel.Instance.ProviderManager.DownloadAndSaveImage(movie, path, BANNER_FILE, FanArtResourcePool, cancellationToken).ConfigureAwait(false));
}
catch (HttpException)
{
@@ -206,7 +234,7 @@ namespace MediaBrowser.Controller.Providers.Movies
cancellationToken.ThrowIfCancellationRequested();
- if (Kernel.Instance.Configuration.DownloadMovieThumb && !item.ResolveArgs.ContainsMetaFileByName(THUMB_FILE))
+ if (ConfigurationManager.Configuration.DownloadMovieThumb && !item.ResolveArgs.ContainsMetaFileByName(THUMB_FILE))
{
var node = doc.SelectSingleNode("//fanart/movie/moviethumbs/moviethumb[@lang = \"" + language + "\"]/@url") ??
doc.SelectSingleNode("//fanart/movie/moviethumbs/moviethumb/@url");
@@ -216,7 +244,7 @@ namespace MediaBrowser.Controller.Providers.Movies
Logger.Debug("FanArtProvider getting Banner for " + movie.Name);
try
{
- movie.SetImage(ImageType.Thumb, await Kernel.Instance.ProviderManager.DownloadAndSaveImage(movie, path, THUMB_FILE, Kernel.Instance.ResourcePools.FanArt, cancellationToken).ConfigureAwait(false));
+ movie.SetImage(ImageType.Thumb, await Kernel.Instance.ProviderManager.DownloadAndSaveImage(movie, path, THUMB_FILE, FanArtResourcePool, cancellationToken).ConfigureAwait(false));
}
catch (HttpException)
{
diff --git a/MediaBrowser.Controller/Providers/Movies/MovieDbProvider.cs b/MediaBrowser.Controller/Providers/Movies/MovieDbProvider.cs
index 34435402fb..8d004a5744 100644
--- a/MediaBrowser.Controller/Providers/Movies/MovieDbProvider.cs
+++ b/MediaBrowser.Controller/Providers/Movies/MovieDbProvider.cs
@@ -1,21 +1,22 @@
-using System.Net;
-using MediaBrowser.Common.Extensions;
+using MediaBrowser.Common.Extensions;
using MediaBrowser.Common.Net;
+using MediaBrowser.Controller.Configuration;
using MediaBrowser.Controller.Entities;
using MediaBrowser.Controller.Entities.Movies;
using MediaBrowser.Model.Entities;
using MediaBrowser.Model.Logging;
using MediaBrowser.Model.Net;
+using MediaBrowser.Model.Serialization;
using System;
using System.Collections.Generic;
using System.Globalization;
using System.IO;
using System.Linq;
+using System.Net;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading;
using System.Threading.Tasks;
-using MediaBrowser.Model.Serialization;
namespace MediaBrowser.Controller.Providers.Movies
{
@@ -31,6 +32,13 @@ namespace MediaBrowser.Controller.Providers.Movies
///
public class MovieDbProvider : BaseMetadataProvider
{
+ ///
+ /// The movie db
+ ///
+ internal readonly SemaphoreSlim MovieDbResourcePool = new SemaphoreSlim(5, 5);
+
+ internal static MovieDbProvider Current { get; private set; }
+
///
/// Gets the json serializer.
///
@@ -46,23 +54,29 @@ namespace MediaBrowser.Controller.Providers.Movies
///
/// Initializes a new instance of the class.
///
+ /// The log manager.
+ /// The configuration manager.
/// The json serializer.
/// The HTTP client.
- /// The Log manager
- /// jsonSerializer
- public MovieDbProvider(IJsonSerializer jsonSerializer, IHttpClient httpClient, ILogManager logManager)
- : base(logManager)
+ public MovieDbProvider(ILogManager logManager, IServerConfigurationManager configurationManager, IJsonSerializer jsonSerializer, IHttpClient httpClient)
+ : base(logManager, configurationManager)
{
- if (jsonSerializer == null)
- {
- throw new ArgumentNullException("jsonSerializer");
- }
- if (httpClient == null)
- {
- throw new ArgumentNullException("httpClient");
- }
JsonSerializer = jsonSerializer;
HttpClient = httpClient;
+ Current = this;
+ }
+
+ ///
+ /// Releases unmanaged and - optionally - managed resources.
+ ///
+ /// true to release both managed and unmanaged resources; false to release only unmanaged resources.
+ protected override void Dispose(bool dispose)
+ {
+ if (dispose)
+ {
+ MovieDbResourcePool.Dispose();
+ }
+ base.Dispose(dispose);
}
///
@@ -103,7 +117,7 @@ namespace MediaBrowser.Controller.Providers.Movies
{
get
{
- return Kernel.Instance.Configuration.SaveLocalMeta;
+ return ConfigurationManager.Configuration.SaveLocalMeta;
}
}
@@ -141,7 +155,7 @@ namespace MediaBrowser.Controller.Providers.Movies
{
try
{
- using (var json = await httpClient.Get(String.Format(TmdbConfigUrl, ApiKey), Kernel.Instance.ResourcePools.MovieDb, CancellationToken.None).ConfigureAwait(false))
+ using (var json = await httpClient.Get(String.Format(TmdbConfigUrl, ApiKey), MovieDbProvider.Current.MovieDbResourcePool, CancellationToken.None).ConfigureAwait(false))
{
return jsonSerializer.DeserializeFromStream(json);
}
@@ -200,11 +214,11 @@ namespace MediaBrowser.Controller.Providers.Movies
{
base.SetLastRefreshed(item, value, status);
- if (Kernel.Instance.Configuration.SaveLocalMeta)
+ if (ConfigurationManager.Configuration.SaveLocalMeta)
{
//in addition to ours, we need to set the last refreshed time for the local data provider
//so it won't see the new files we download and process them all over again
- if (JsonProvider == null) JsonProvider = new MovieProviderFromJson(HttpClient, JsonSerializer, LogManager);
+ if (JsonProvider == null) JsonProvider = new MovieProviderFromJson(LogManager, ConfigurationManager, JsonSerializer, HttpClient);
var data = item.ProviderData.GetValueOrDefault(JsonProvider.Id, new BaseProviderInfo { ProviderId = JsonProvider.Id });
data.LastRefreshed = value;
item.ProviderData[JsonProvider.Id] = data;
@@ -233,7 +247,7 @@ namespace MediaBrowser.Controller.Providers.Movies
{
if (item.DontFetchMeta) return false;
- if (Kernel.Instance.Configuration.SaveLocalMeta && HasFileSystemStampChanged(item, providerInfo))
+ if (ConfigurationManager.Configuration.SaveLocalMeta && HasFileSystemStampChanged(item, providerInfo))
{
//If they deleted something from file system, chances are, this item was mis-identified the first time
item.SetProviderId(MetadataProviders.Tmdb, null);
@@ -250,7 +264,7 @@ namespace MediaBrowser.Controller.Providers.Movies
var downloadDate = providerInfo.LastRefreshed;
- if (Kernel.Instance.Configuration.MetadataRefreshDays == -1 && downloadDate != DateTime.MinValue)
+ if (ConfigurationManager.Configuration.MetadataRefreshDays == -1 && downloadDate != DateTime.MinValue)
{
return false;
}
@@ -258,7 +272,7 @@ namespace MediaBrowser.Controller.Providers.Movies
if (DateTime.Today.Subtract(item.DateCreated).TotalDays > 180 && downloadDate != DateTime.MinValue)
return false; // don't trigger a refresh data for item that are more than 6 months old and have been refreshed before
- if (DateTime.Today.Subtract(downloadDate).TotalDays < Kernel.Instance.Configuration.MetadataRefreshDays) // only refresh every n days
+ if (DateTime.Today.Subtract(downloadDate).TotalDays < ConfigurationManager.Configuration.MetadataRefreshDays) // only refresh every n days
return false;
if (HasAltMeta(item))
@@ -266,7 +280,7 @@ namespace MediaBrowser.Controller.Providers.Movies
- Logger.Debug("MovieDbProvider - " + item.Name + " needs refresh. Download date: " + downloadDate + " item created date: " + item.DateCreated + " Check for Update age: " + Kernel.Instance.Configuration.MetadataRefreshDays);
+ Logger.Debug("MovieDbProvider - " + item.Name + " needs refresh. Download date: " + downloadDate + " item created date: " + item.DateCreated + " Check for Update age: " + ConfigurationManager.Configuration.MetadataRefreshDays);
return true;
}
@@ -293,7 +307,7 @@ namespace MediaBrowser.Controller.Providers.Movies
cancellationToken.ThrowIfCancellationRequested();
- if (!Kernel.Instance.Configuration.SaveLocalMeta || !HasLocalMeta(item) || (force && !HasLocalMeta(item)))
+ if (!ConfigurationManager.Configuration.SaveLocalMeta || !HasLocalMeta(item) || (force && !HasLocalMeta(item)))
{
try
{
@@ -407,7 +421,7 @@ namespace MediaBrowser.Controller.Providers.Movies
}
Logger.Info("MovieDbProvider: Finding id for movie: " + name);
- string language = Kernel.Instance.Configuration.PreferredMetadataLanguage.ToLower();
+ string language = ConfigurationManager.Configuration.PreferredMetadataLanguage.ToLower();
//if we are a boxset - look at our first child
var boxset = item as BoxSet;
@@ -478,7 +492,7 @@ namespace MediaBrowser.Controller.Providers.Movies
try
{
- using (Stream json = await HttpClient.Get(url3, Kernel.Instance.ResourcePools.MovieDb, cancellationToken).ConfigureAwait(false))
+ using (Stream json = await HttpClient.Get(url3, MovieDbResourcePool, cancellationToken).ConfigureAwait(false))
{
searchResult = JsonSerializer.DeserializeFromStream(json);
}
@@ -510,7 +524,7 @@ namespace MediaBrowser.Controller.Providers.Movies
try
{
- using (var json = await HttpClient.Get(url3, Kernel.Instance.ResourcePools.MovieDb, cancellationToken).ConfigureAwait(false))
+ using (var json = await HttpClient.Get(url3, MovieDbResourcePool, cancellationToken).ConfigureAwait(false))
{
searchResult = JsonSerializer.DeserializeFromStream(json);
}
@@ -545,11 +559,11 @@ namespace MediaBrowser.Controller.Providers.Movies
if (matchedName == null)
{
//that title didn't match - look for alternatives
- url3 = string.Format(AltTitleSearch, id, ApiKey, Kernel.Instance.Configuration.MetadataCountryCode);
+ url3 = string.Format(AltTitleSearch, id, ApiKey, ConfigurationManager.Configuration.MetadataCountryCode);
try
{
- using (var json = await HttpClient.Get(url3, Kernel.Instance.ResourcePools.MovieDb, cancellationToken).ConfigureAwait(false))
+ using (var json = await HttpClient.Get(url3, MovieDbResourcePool, cancellationToken).ConfigureAwait(false))
{
var response = JsonSerializer.DeserializeFromStream(json);
@@ -630,7 +644,7 @@ namespace MediaBrowser.Controller.Providers.Movies
try
{
- using (Stream json = await HttpClient.Get(url, Kernel.Instance.ResourcePools.MovieDb, cancellationToken).ConfigureAwait(false))
+ using (Stream json = await HttpClient.Get(url, MovieDbResourcePool, cancellationToken).ConfigureAwait(false))
{
var movieResult = JsonSerializer.DeserializeFromStream(json);
@@ -703,7 +717,7 @@ namespace MediaBrowser.Controller.Providers.Movies
}
//and save locally
- if (Kernel.Instance.Configuration.SaveLocalMeta)
+ if (ConfigurationManager.Configuration.SaveLocalMeta)
{
var ms = new MemoryStream();
JsonSerializer.SerializeToStream(mainResult, ms);
@@ -724,14 +738,14 @@ namespace MediaBrowser.Controller.Providers.Movies
protected async Task FetchMainResult(BaseItem item, string id, CancellationToken cancellationToken)
{
ItemType = item is BoxSet ? "collection" : "movie";
- string url = string.Format(GetInfo3, id, ApiKey, Kernel.Instance.Configuration.PreferredMetadataLanguage, ItemType);
+ string url = string.Format(GetInfo3, id, ApiKey, ConfigurationManager.Configuration.PreferredMetadataLanguage, ItemType);
CompleteMovieData mainResult;
cancellationToken.ThrowIfCancellationRequested();
try
{
- using (var json = await HttpClient.Get(url, Kernel.Instance.ResourcePools.MovieDb, cancellationToken).ConfigureAwait(false))
+ using (var json = await HttpClient.Get(url, MovieDbResourcePool, cancellationToken).ConfigureAwait(false))
{
mainResult = JsonSerializer.DeserializeFromStream(json);
}
@@ -756,14 +770,14 @@ namespace MediaBrowser.Controller.Providers.Movies
if (mainResult != null && string.IsNullOrEmpty(mainResult.overview))
{
- if (Kernel.Instance.Configuration.PreferredMetadataLanguage.ToLower() != "en")
+ if (ConfigurationManager.Configuration.PreferredMetadataLanguage.ToLower() != "en")
{
- Logger.Info("MovieDbProvider couldn't find meta for language " + Kernel.Instance.Configuration.PreferredMetadataLanguage + ". Trying English...");
+ Logger.Info("MovieDbProvider couldn't find meta for language " + ConfigurationManager.Configuration.PreferredMetadataLanguage + ". Trying English...");
url = string.Format(GetInfo3, id, ApiKey, "en", ItemType);
try
{
- using (Stream json = await HttpClient.Get(url, Kernel.Instance.ResourcePools.MovieDb, cancellationToken).ConfigureAwait(false))
+ using (Stream json = await HttpClient.Get(url, MovieDbResourcePool, cancellationToken).ConfigureAwait(false))
{
mainResult = JsonSerializer.DeserializeFromStream(json);
}
@@ -799,7 +813,7 @@ namespace MediaBrowser.Controller.Providers.Movies
try
{
- using (Stream json = await HttpClient.Get(url, Kernel.Instance.ResourcePools.MovieDb, cancellationToken).ConfigureAwait(false))
+ using (Stream json = await HttpClient.Get(url, MovieDbResourcePool, cancellationToken).ConfigureAwait(false))
{
cast = JsonSerializer.DeserializeFromStream(json);
}
@@ -826,7 +840,7 @@ namespace MediaBrowser.Controller.Providers.Movies
try
{
- using (Stream json = await HttpClient.Get(url, Kernel.Instance.ResourcePools.MovieDb, cancellationToken).ConfigureAwait(false))
+ using (Stream json = await HttpClient.Get(url, MovieDbResourcePool, cancellationToken).ConfigureAwait(false))
{
releases = JsonSerializer.DeserializeFromStream(json);
}
@@ -855,7 +869,7 @@ namespace MediaBrowser.Controller.Providers.Movies
try
{
- using (Stream json = await HttpClient.Get(url, Kernel.Instance.ResourcePools.MovieDb, cancellationToken).ConfigureAwait(false))
+ using (Stream json = await HttpClient.Get(url, MovieDbResourcePool, cancellationToken).ConfigureAwait(false))
{
images = JsonSerializer.DeserializeFromStream(json);
}
@@ -883,7 +897,7 @@ namespace MediaBrowser.Controller.Providers.Movies
movie.SetProviderId(MetadataProviders.Imdb, movieData.imdb_id);
float rating;
string voteAvg = movieData.vote_average.ToString();
- string cultureStr = Kernel.Instance.Configuration.PreferredMetadataLanguage + "-" + Kernel.Instance.Configuration.MetadataCountryCode;
+ string cultureStr = ConfigurationManager.Configuration.PreferredMetadataLanguage + "-" + ConfigurationManager.Configuration.MetadataCountryCode;
CultureInfo culture;
try
{
@@ -900,7 +914,7 @@ namespace MediaBrowser.Controller.Providers.Movies
//release date and certification are retrieved based on configured country and we fall back on US if not there
if (movieData.countries != null)
{
- var ourRelease = movieData.countries.FirstOrDefault(c => c.iso_3166_1.Equals(Kernel.Instance.Configuration.MetadataCountryCode, StringComparison.OrdinalIgnoreCase)) ?? new Country();
+ var ourRelease = movieData.countries.FirstOrDefault(c => c.iso_3166_1.Equals(ConfigurationManager.Configuration.MetadataCountryCode, StringComparison.OrdinalIgnoreCase)) ?? new Country();
var usRelease = movieData.countries.FirstOrDefault(c => c.iso_3166_1.Equals("US", StringComparison.OrdinalIgnoreCase)) ?? new Country();
movie.OfficialRating = ourRelease.certification ?? usRelease.certification;
@@ -975,17 +989,17 @@ namespace MediaBrowser.Controller.Providers.Movies
cancellationToken.ThrowIfCancellationRequested();
// poster
- if (images.posters != null && images.posters.Count > 0 && (Kernel.Instance.Configuration.RefreshItemImages || !item.HasLocalImage("folder")))
+ if (images.posters != null && images.posters.Count > 0 && (ConfigurationManager.Configuration.RefreshItemImages || !item.HasLocalImage("folder")))
{
var tmdbSettings = await TmdbSettings.ConfigureAwait(false);
- var tmdbImageUrl = tmdbSettings.images.base_url + Kernel.Instance.Configuration.TmdbFetchedPosterSize;
+ var tmdbImageUrl = tmdbSettings.images.base_url + ConfigurationManager.Configuration.TmdbFetchedPosterSize;
// get highest rated poster for our language
var postersSortedByVote = images.posters.OrderByDescending(i => i.vote_average);
- var poster = postersSortedByVote.FirstOrDefault(p => p.iso_639_1 != null && p.iso_639_1.Equals(Kernel.Instance.Configuration.PreferredMetadataLanguage, StringComparison.OrdinalIgnoreCase));
- if (poster == null && !Kernel.Instance.Configuration.PreferredMetadataLanguage.Equals("en"))
+ var poster = postersSortedByVote.FirstOrDefault(p => p.iso_639_1 != null && p.iso_639_1.Equals(ConfigurationManager.Configuration.PreferredMetadataLanguage, StringComparison.OrdinalIgnoreCase));
+ if (poster == null && !ConfigurationManager.Configuration.PreferredMetadataLanguage.Equals("en"))
{
// couldn't find our specific language, find english (if that wasn't our language)
poster = postersSortedByVote.FirstOrDefault(p => p.iso_639_1 != null && p.iso_639_1.Equals("en", StringComparison.OrdinalIgnoreCase));
@@ -1004,7 +1018,7 @@ namespace MediaBrowser.Controller.Providers.Movies
{
try
{
- item.PrimaryImagePath = await Kernel.Instance.ProviderManager.DownloadAndSaveImage(item, tmdbImageUrl + poster.file_path, "folder" + Path.GetExtension(poster.file_path), Kernel.Instance.ResourcePools.MovieDb, cancellationToken).ConfigureAwait(false);
+ item.PrimaryImagePath = await Kernel.Instance.ProviderManager.DownloadAndSaveImage(item, tmdbImageUrl + poster.file_path, "folder" + Path.GetExtension(poster.file_path), MovieDbResourcePool, cancellationToken).ConfigureAwait(false);
}
catch (HttpException)
{
@@ -1025,18 +1039,18 @@ namespace MediaBrowser.Controller.Providers.Movies
var tmdbSettings = await TmdbSettings.ConfigureAwait(false);
- var tmdbImageUrl = tmdbSettings.images.base_url + Kernel.Instance.Configuration.TmdbFetchedBackdropSize;
+ var tmdbImageUrl = tmdbSettings.images.base_url + ConfigurationManager.Configuration.TmdbFetchedBackdropSize;
//backdrops should be in order of rating. get first n ones
- var numToFetch = Math.Min(Kernel.Instance.Configuration.MaxBackdrops, images.backdrops.Count);
+ var numToFetch = Math.Min(ConfigurationManager.Configuration.MaxBackdrops, images.backdrops.Count);
for (var i = 0; i < numToFetch; i++)
{
var bdName = "backdrop" + (i == 0 ? "" : i.ToString());
- if (Kernel.Instance.Configuration.RefreshItemImages || !item.HasLocalImage(bdName))
+ if (ConfigurationManager.Configuration.RefreshItemImages || !item.HasLocalImage(bdName))
{
try
{
- item.BackdropImagePaths.Add(await Kernel.Instance.ProviderManager.DownloadAndSaveImage(item, tmdbImageUrl + images.backdrops[i].file_path, bdName + Path.GetExtension(images.backdrops[i].file_path), Kernel.Instance.ResourcePools.MovieDb, cancellationToken).ConfigureAwait(false));
+ item.BackdropImagePaths.Add(await Kernel.Instance.ProviderManager.DownloadAndSaveImage(item, tmdbImageUrl + images.backdrops[i].file_path, bdName + Path.GetExtension(images.backdrops[i].file_path), MovieDbResourcePool, cancellationToken).ConfigureAwait(false));
}
catch (HttpException)
{
diff --git a/MediaBrowser.Controller/Providers/Movies/MovieProviderFromJson.cs b/MediaBrowser.Controller/Providers/Movies/MovieProviderFromJson.cs
index aa507d02ec..2a7a09625f 100644
--- a/MediaBrowser.Controller/Providers/Movies/MovieProviderFromJson.cs
+++ b/MediaBrowser.Controller/Providers/Movies/MovieProviderFromJson.cs
@@ -1,4 +1,5 @@
using MediaBrowser.Common.Net;
+using MediaBrowser.Controller.Configuration;
using MediaBrowser.Controller.Entities;
using MediaBrowser.Model.Logging;
using MediaBrowser.Model.Serialization;
@@ -14,8 +15,8 @@ namespace MediaBrowser.Controller.Providers.Movies
///
public class MovieProviderFromJson : MovieDbProvider
{
- public MovieProviderFromJson(IHttpClient httpClient, IJsonSerializer jsonSerializer, ILogManager logManager)
- : base(jsonSerializer, httpClient, logManager)
+ public MovieProviderFromJson(ILogManager logManager, IServerConfigurationManager configurationManager, IJsonSerializer jsonSerializer, IHttpClient httpClient) :
+ base(logManager, configurationManager, jsonSerializer, httpClient)
{
}
diff --git a/MediaBrowser.Controller/Providers/Movies/MovieProviderFromXml.cs b/MediaBrowser.Controller/Providers/Movies/MovieProviderFromXml.cs
index 555017e28e..3e5a6fe8d7 100644
--- a/MediaBrowser.Controller/Providers/Movies/MovieProviderFromXml.cs
+++ b/MediaBrowser.Controller/Providers/Movies/MovieProviderFromXml.cs
@@ -1,4 +1,5 @@
-using MediaBrowser.Controller.Entities;
+using MediaBrowser.Controller.Configuration;
+using MediaBrowser.Controller.Entities;
using MediaBrowser.Controller.Entities.Movies;
using System;
using System.IO;
@@ -13,7 +14,7 @@ namespace MediaBrowser.Controller.Providers.Movies
///
public class MovieProviderFromXml : BaseMetadataProvider
{
- public MovieProviderFromXml(ILogManager logManager) : base(logManager)
+ public MovieProviderFromXml(ILogManager logManager, IServerConfigurationManager configurationManager) : base(logManager, configurationManager)
{
}
diff --git a/MediaBrowser.Controller/Providers/Movies/PersonProviderFromJson.cs b/MediaBrowser.Controller/Providers/Movies/PersonProviderFromJson.cs
index 1004eaeae0..278d672617 100644
--- a/MediaBrowser.Controller/Providers/Movies/PersonProviderFromJson.cs
+++ b/MediaBrowser.Controller/Providers/Movies/PersonProviderFromJson.cs
@@ -1,4 +1,5 @@
using MediaBrowser.Common.Net;
+using MediaBrowser.Controller.Configuration;
using MediaBrowser.Controller.Entities;
using MediaBrowser.Model.Logging;
using MediaBrowser.Model.Serialization;
@@ -14,8 +15,8 @@ namespace MediaBrowser.Controller.Providers.Movies
///
class PersonProviderFromJson : TmdbPersonProvider
{
- public PersonProviderFromJson(IHttpClient httpClient, IJsonSerializer jsonSerializer, ILogManager logManager)
- : base(httpClient, jsonSerializer, logManager)
+ public PersonProviderFromJson(IHttpClient httpClient, IJsonSerializer jsonSerializer, ILogManager logManager, IServerConfigurationManager configurationManager) :
+ base(httpClient, jsonSerializer, logManager, configurationManager)
{
}
diff --git a/MediaBrowser.Controller/Providers/Movies/TmdbPersonProvider.cs b/MediaBrowser.Controller/Providers/Movies/TmdbPersonProvider.cs
index 3c4ac6076f..5c977a928c 100644
--- a/MediaBrowser.Controller/Providers/Movies/TmdbPersonProvider.cs
+++ b/MediaBrowser.Controller/Providers/Movies/TmdbPersonProvider.cs
@@ -1,4 +1,5 @@
using MediaBrowser.Common.Net;
+using MediaBrowser.Controller.Configuration;
using MediaBrowser.Controller.Entities;
using MediaBrowser.Model.Entities;
using MediaBrowser.Model.Logging;
@@ -25,26 +26,8 @@ namespace MediaBrowser.Controller.Providers.Movies
///
protected const string MetaFileName = "MBPerson.json";
- ///
- /// Gets the json serializer.
- ///
- /// The json serializer.
- protected IJsonSerializer JsonSerializer { get; private set; }
-
- ///
- /// Gets the HTTP client.
- ///
- /// The HTTP client.
- protected IHttpClient HttpClient { get; private set; }
-
- ///
- /// Initializes a new instance of the class.
- ///
- /// The HTTP client.
- /// The json serializer.
- /// jsonSerializer
- public TmdbPersonProvider(IHttpClient httpClient, IJsonSerializer jsonSerializer, ILogManager logManager)
- : base(logManager)
+ public TmdbPersonProvider(IHttpClient httpClient, IJsonSerializer jsonSerializer, ILogManager logManager, IServerConfigurationManager configurationManager)
+ : base(logManager, configurationManager)
{
if (jsonSerializer == null)
{
@@ -58,6 +41,18 @@ namespace MediaBrowser.Controller.Providers.Movies
JsonSerializer = jsonSerializer;
}
+ ///
+ /// Gets the json serializer.
+ ///
+ /// The json serializer.
+ protected IJsonSerializer JsonSerializer { get; private set; }
+
+ ///
+ /// Gets the HTTP client.
+ ///
+ /// The HTTP client.
+ protected IHttpClient HttpClient { get; private set; }
+
///
/// Supportses the specified item.
///
@@ -78,7 +73,7 @@ namespace MediaBrowser.Controller.Providers.Movies
{
//we fetch if either info or image needed and haven't already tried recently
return (string.IsNullOrEmpty(item.PrimaryImagePath) || !item.ResolveArgs.ContainsMetaFileByName(MetaFileName))
- && DateTime.Today.Subtract(providerInfo.LastRefreshed).TotalDays > Kernel.Instance.Configuration.MetadataRefreshDays;
+ && DateTime.Today.Subtract(providerInfo.LastRefreshed).TotalDays > ConfigurationManager.Configuration.MetadataRefreshDays;
}
///
@@ -165,7 +160,7 @@ namespace MediaBrowser.Controller.Providers.Movies
try
{
- using (Stream json = await HttpClient.Get(url, Kernel.Instance.ResourcePools.MovieDb, cancellationToken).ConfigureAwait(false))
+ using (Stream json = await HttpClient.Get(url, MovieDbProvider.Current.MovieDbResourcePool, cancellationToken).ConfigureAwait(false))
{
searchResult = JsonSerializer.DeserializeFromStream(json);
}
@@ -191,7 +186,7 @@ namespace MediaBrowser.Controller.Providers.Movies
try
{
- using (Stream json = await HttpClient.Get(url, Kernel.Instance.ResourcePools.MovieDb, cancellationToken).ConfigureAwait(false))
+ using (Stream json = await HttpClient.Get(url, MovieDbProvider.Current.MovieDbResourcePool, cancellationToken).ConfigureAwait(false))
{
if (json != null)
{
@@ -254,7 +249,7 @@ namespace MediaBrowser.Controller.Providers.Movies
try
{
- using (Stream json = await HttpClient.Get(url, Kernel.Instance.ResourcePools.MovieDb, cancellationToken).ConfigureAwait(false))
+ using (Stream json = await HttpClient.Get(url, MovieDbProvider.Current.MovieDbResourcePool, cancellationToken).ConfigureAwait(false))
{
if (json != null)
{
@@ -273,7 +268,7 @@ namespace MediaBrowser.Controller.Providers.Movies
searchResult.Profiles.FirstOrDefault(
p =>
!string.IsNullOrEmpty(p.Iso_639_1) &&
- p.Iso_639_1.Equals(Kernel.Instance.Configuration.PreferredMetadataLanguage,
+ p.Iso_639_1.Equals(ConfigurationManager.Configuration.PreferredMetadataLanguage,
StringComparison.OrdinalIgnoreCase));
if (profile == null)
{
@@ -282,7 +277,7 @@ namespace MediaBrowser.Controller.Providers.Movies
searchResult.Profiles.FirstOrDefault(
p =>
!string.IsNullOrEmpty(p.Iso_639_1) &&
- p.Iso_639_1.Equals(Kernel.Instance.Configuration.PreferredMetadataLanguage,
+ p.Iso_639_1.Equals(ConfigurationManager.Configuration.PreferredMetadataLanguage,
StringComparison.OrdinalIgnoreCase));
}
@@ -295,7 +290,7 @@ namespace MediaBrowser.Controller.Providers.Movies
{
var tmdbSettings = await Kernel.Instance.MetadataProviders.OfType().First().TmdbSettings.ConfigureAwait(false);
- var img = await DownloadAndSaveImage(person, tmdbSettings.images.base_url + Kernel.Instance.Configuration.TmdbFetchedProfileSize + profile.File_Path,
+ var img = await DownloadAndSaveImage(person, tmdbSettings.images.base_url + ConfigurationManager.Configuration.TmdbFetchedProfileSize + profile.File_Path,
"folder" + Path.GetExtension(profile.File_Path), cancellationToken).ConfigureAwait(false);
if (!string.IsNullOrEmpty(img))
@@ -322,7 +317,7 @@ namespace MediaBrowser.Controller.Providers.Movies
var localPath = Path.Combine(item.MetaLocation, targetName);
if (!item.ResolveArgs.ContainsMetaFileByName(targetName))
{
- using (var sourceStream = await HttpClient.GetMemoryStream(source, Kernel.Instance.ResourcePools.MovieDb, cancellationToken).ConfigureAwait(false))
+ using (var sourceStream = await HttpClient.GetMemoryStream(source, MovieDbProvider.Current.MovieDbResourcePool, cancellationToken).ConfigureAwait(false))
{
await Kernel.Instance.FileSystemManager.SaveToLibraryFilesystem(item, localPath, sourceStream, cancellationToken).ConfigureAwait(false);
diff --git a/MediaBrowser.Controller/Providers/Music/LastfmBaseProvider.cs b/MediaBrowser.Controller/Providers/Music/LastfmBaseProvider.cs
index 364986130f..c73321e552 100644
--- a/MediaBrowser.Controller/Providers/Music/LastfmBaseProvider.cs
+++ b/MediaBrowser.Controller/Providers/Music/LastfmBaseProvider.cs
@@ -1,5 +1,6 @@
using System.Net;
using MediaBrowser.Common.Net;
+using MediaBrowser.Controller.Configuration;
using MediaBrowser.Controller.Entities;
using MediaBrowser.Model.Entities;
using MediaBrowser.Model.Logging;
@@ -23,6 +24,29 @@ namespace MediaBrowser.Controller.Providers.Music
///
public abstract class LastfmBaseProvider : BaseMetadataProvider
{
+ ///
+ /// Initializes a new instance of the class.
+ ///
+ /// The json serializer.
+ /// The HTTP client.
+ /// The log manager.
+ /// The configuration manager.
+ /// jsonSerializer
+ protected LastfmBaseProvider(IJsonSerializer jsonSerializer, IHttpClient httpClient, ILogManager logManager, IServerConfigurationManager configurationManager)
+ : base(logManager, configurationManager)
+ {
+ if (jsonSerializer == null)
+ {
+ throw new ArgumentNullException("jsonSerializer");
+ }
+ if (httpClient == null)
+ {
+ throw new ArgumentNullException("httpClient");
+ }
+ JsonSerializer = jsonSerializer;
+ HttpClient = httpClient;
+ }
+
///
/// Gets the json serializer.
///
@@ -40,28 +64,6 @@ namespace MediaBrowser.Controller.Providers.Music
///
protected string LocalMetaFileName { get; set; }
- ///
- /// Initializes a new instance of the class.
- ///
- /// The json serializer.
- /// The HTTP client.
- /// The Log manager
- /// jsonSerializer
- public LastfmBaseProvider(IJsonSerializer jsonSerializer, IHttpClient httpClient, ILogManager logManager)
- : base(logManager)
- {
- if (jsonSerializer == null)
- {
- throw new ArgumentNullException("jsonSerializer");
- }
- if (httpClient == null)
- {
- throw new ArgumentNullException("httpClient");
- }
- JsonSerializer = jsonSerializer;
- HttpClient = httpClient;
- }
-
///
/// Gets the priority.
///
@@ -90,7 +92,7 @@ namespace MediaBrowser.Controller.Providers.Music
{
get
{
- return Kernel.Instance.Configuration.SaveLocalMeta;
+ return ConfigurationManager.Configuration.SaveLocalMeta;
}
}
@@ -101,7 +103,7 @@ namespace MediaBrowser.Controller.Providers.Music
{
if (item.DontFetchMeta) return false;
- if (Kernel.Instance.Configuration.SaveLocalMeta && HasFileSystemStampChanged(item, providerInfo))
+ if (ConfigurationManager.Configuration.SaveLocalMeta && HasFileSystemStampChanged(item, providerInfo))
{
//If they deleted something from file system, chances are, this item was mis-identified the first time
item.SetProviderId(MetadataProviders.Musicbrainz, null);
@@ -118,7 +120,7 @@ namespace MediaBrowser.Controller.Providers.Music
var downloadDate = providerInfo.LastRefreshed;
- if (Kernel.Instance.Configuration.MetadataRefreshDays == -1 && downloadDate != DateTime.MinValue)
+ if (ConfigurationManager.Configuration.MetadataRefreshDays == -1 && downloadDate != DateTime.MinValue)
{
return false;
}
@@ -126,11 +128,11 @@ namespace MediaBrowser.Controller.Providers.Music
if (DateTime.Today.Subtract(item.DateCreated).TotalDays > 180 && downloadDate != DateTime.MinValue)
return false; // don't trigger a refresh data for item that are more than 6 months old and have been refreshed before
- if (DateTime.Today.Subtract(downloadDate).TotalDays < Kernel.Instance.Configuration.MetadataRefreshDays) // only refresh every n days
+ if (DateTime.Today.Subtract(downloadDate).TotalDays < ConfigurationManager.Configuration.MetadataRefreshDays) // only refresh every n days
return false;
- Logger.Debug("LastfmProvider - " + item.Name + " needs refresh. Download date: " + downloadDate + " item created date: " + item.DateCreated + " Check for Update age: " + Kernel.Instance.Configuration.MetadataRefreshDays);
+ Logger.Debug("LastfmProvider - " + item.Name + " needs refresh. Download date: " + downloadDate + " item created date: " + item.DateCreated + " Check for Update age: " + ConfigurationManager.Configuration.MetadataRefreshDays);
return true;
}
@@ -151,7 +153,7 @@ namespace MediaBrowser.Controller.Providers.Music
cancellationToken.ThrowIfCancellationRequested();
- if (!Kernel.Instance.Configuration.SaveLocalMeta || !HasLocalMeta(item) || (force && !HasLocalMeta(item)))
+ if (!ConfigurationManager.Configuration.SaveLocalMeta || !HasLocalMeta(item) || (force && !HasLocalMeta(item)))
{
try
{
diff --git a/MediaBrowser.Controller/Providers/ProviderManager.cs b/MediaBrowser.Controller/Providers/ProviderManager.cs
index 0f7198756a..16e862fb91 100644
--- a/MediaBrowser.Controller/Providers/ProviderManager.cs
+++ b/MediaBrowser.Controller/Providers/ProviderManager.cs
@@ -1,6 +1,8 @@
-using MediaBrowser.Common.Extensions;
+using MediaBrowser.Common.Configuration;
+using MediaBrowser.Common.Extensions;
using MediaBrowser.Common.IO;
using MediaBrowser.Common.Net;
+using MediaBrowser.Controller.Configuration;
using MediaBrowser.Controller.Entities;
using MediaBrowser.Model.Logging;
using System;
@@ -39,18 +41,37 @@ namespace MediaBrowser.Controller.Providers
///
private readonly IHttpClient _httpClient;
+ private IServerConfigurationManager ConfigurationManager { get; set; }
+
///
/// Initializes a new instance of the class.
///
/// The kernel.
/// The HTTP client.
/// The logger.
- public ProviderManager(Kernel kernel, IHttpClient httpClient, ILogger logger)
+ public ProviderManager(Kernel kernel, IHttpClient httpClient, ILogger logger, IServerConfigurationManager configurationManager)
: base(kernel)
{
_logger = logger;
_httpClient = httpClient;
+ ConfigurationManager = configurationManager;
_remoteImageCache = new FileSystemRepository(ImagesDataPath);
+
+ configurationManager.ConfigurationUpdated += configurationManager_ConfigurationUpdated;
+ }
+
+ ///
+ /// Handles the ConfigurationUpdated event of the configurationManager control.
+ ///
+ /// The source of the event.
+ /// The instance containing the event data.
+ void configurationManager_ConfigurationUpdated(object sender, EventArgs e)
+ {
+ // Validate currently executing providers, in the background
+ Task.Run(() =>
+ {
+ ValidateCurrentlyRunningProviders();
+ });
}
///
@@ -67,7 +88,7 @@ namespace MediaBrowser.Controller.Providers
{
if (_imagesDataPath == null)
{
- _imagesDataPath = Path.Combine(Kernel.ApplicationPaths.DataPath, "remote-images");
+ _imagesDataPath = Path.Combine(ConfigurationManager.ApplicationPaths.DataPath, "remote-images");
if (!Directory.Exists(_imagesDataPath))
{
@@ -145,7 +166,7 @@ namespace MediaBrowser.Controller.Providers
cancellationToken.ThrowIfCancellationRequested();
// Skip if internet providers are currently disabled
- if (provider.RequiresInternet && !Kernel.Configuration.EnableInternetProviders)
+ if (provider.RequiresInternet && !ConfigurationManager.Configuration.EnableInternetProviders)
{
continue;
}
@@ -157,7 +178,7 @@ namespace MediaBrowser.Controller.Providers
}
// Skip if internet provider and this type is not allowed
- if (provider.RequiresInternet && Kernel.Configuration.EnableInternetProviders && Kernel.Configuration.InternetProviderExcludeTypes.Contains(item.GetType().Name, StringComparer.OrdinalIgnoreCase))
+ if (provider.RequiresInternet && ConfigurationManager.Configuration.EnableInternetProviders && ConfigurationManager.Configuration.InternetProviderExcludeTypes.Contains(item.GetType().Name, StringComparer.OrdinalIgnoreCase))
{
continue;
}
@@ -249,8 +270,8 @@ namespace MediaBrowser.Controller.Providers
{
_logger.Info("Validing currently running providers");
- var enableInternetProviders = Kernel.Configuration.EnableInternetProviders;
- var internetProviderExcludeTypes = Kernel.Configuration.InternetProviderExcludeTypes;
+ var enableInternetProviders = ConfigurationManager.Configuration.EnableInternetProviders;
+ var internetProviderExcludeTypes = ConfigurationManager.Configuration.InternetProviderExcludeTypes;
foreach (var tuple in _currentlyRunningProviders.Values
.Where(p => p.Item1.RequiresInternet && (!enableInternetProviders || internetProviderExcludeTypes.Contains(p.Item2.GetType().Name, StringComparer.OrdinalIgnoreCase)))
@@ -290,13 +311,13 @@ namespace MediaBrowser.Controller.Providers
}
//download and save locally
- var localPath = Kernel.Configuration.SaveLocalMeta ?
+ var localPath = ConfigurationManager.Configuration.SaveLocalMeta ?
Path.Combine(item.MetaLocation, targetName) :
_remoteImageCache.GetResourcePath(item.GetType().FullName + item.Path.ToLower(), targetName);
var img = await _httpClient.GetMemoryStream(source, resourcePool, cancellationToken).ConfigureAwait(false);
- if (Kernel.Configuration.SaveLocalMeta) // queue to media directories
+ if (ConfigurationManager.Configuration.SaveLocalMeta) // queue to media directories
{
await Kernel.FileSystemManager.SaveToLibraryFilesystem(item, localPath, img, cancellationToken).ConfigureAwait(false);
}
diff --git a/MediaBrowser.Controller/Providers/SortNameProvider.cs b/MediaBrowser.Controller/Providers/SortNameProvider.cs
index 407db4c8e8..2214d8a080 100644
--- a/MediaBrowser.Controller/Providers/SortNameProvider.cs
+++ b/MediaBrowser.Controller/Providers/SortNameProvider.cs
@@ -1,10 +1,11 @@
-using MediaBrowser.Controller.Entities;
+using MediaBrowser.Controller.Configuration;
+using MediaBrowser.Controller.Entities;
using MediaBrowser.Controller.Entities.Audio;
using MediaBrowser.Controller.Entities.TV;
+using MediaBrowser.Model.Logging;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
-using MediaBrowser.Model.Logging;
namespace MediaBrowser.Controller.Providers
{
@@ -13,7 +14,8 @@ namespace MediaBrowser.Controller.Providers
///
public class SortNameProvider : BaseMetadataProvider
{
- public SortNameProvider(ILogManager logManager) : base(logManager)
+ public SortNameProvider(ILogManager logManager, IServerConfigurationManager configurationManager)
+ : base(logManager, configurationManager)
{
}
@@ -99,14 +101,14 @@ namespace MediaBrowser.Controller.Providers
if (item.Name == null) return false; //some items may not have name filled in properly
var sortable = item.Name.Trim().ToLower();
- sortable = Kernel.Instance.Configuration.SortRemoveCharacters.Aggregate(sortable, (current, search) => current.Replace(search.ToLower(), string.Empty));
+ sortable = ConfigurationManager.Configuration.SortRemoveCharacters.Aggregate(sortable, (current, search) => current.Replace(search.ToLower(), string.Empty));
- sortable = Kernel.Instance.Configuration.SortReplaceCharacters.Aggregate(sortable, (current, search) => current.Replace(search.ToLower(), " "));
+ sortable = ConfigurationManager.Configuration.SortReplaceCharacters.Aggregate(sortable, (current, search) => current.Replace(search.ToLower(), " "));
- foreach (var search in Kernel.Instance.Configuration.SortRemoveWords)
+ foreach (var search in ConfigurationManager.Configuration.SortRemoveWords)
{
cancellationToken.ThrowIfCancellationRequested();
-
+
var searchLower = search.ToLower();
// Remove from beginning if a space follows
if (sortable.StartsWith(searchLower + " "))
diff --git a/MediaBrowser.Controller/Providers/TV/EpisodeImageFromMediaLocationProvider.cs b/MediaBrowser.Controller/Providers/TV/EpisodeImageFromMediaLocationProvider.cs
index 9c50091f19..e4ef738925 100644
--- a/MediaBrowser.Controller/Providers/TV/EpisodeImageFromMediaLocationProvider.cs
+++ b/MediaBrowser.Controller/Providers/TV/EpisodeImageFromMediaLocationProvider.cs
@@ -1,4 +1,5 @@
-using MediaBrowser.Controller.Entities;
+using MediaBrowser.Controller.Configuration;
+using MediaBrowser.Controller.Entities;
using MediaBrowser.Controller.Entities.TV;
using MediaBrowser.Model.Entities;
using System;
@@ -14,7 +15,7 @@ namespace MediaBrowser.Controller.Providers.TV
///
public class EpisodeImageFromMediaLocationProvider : BaseMetadataProvider
{
- public EpisodeImageFromMediaLocationProvider(ILogManager logManager) : base(logManager)
+ public EpisodeImageFromMediaLocationProvider(ILogManager logManager, IServerConfigurationManager configurationManager) : base(logManager, configurationManager)
{
}
diff --git a/MediaBrowser.Controller/Providers/TV/EpisodeProviderFromXml.cs b/MediaBrowser.Controller/Providers/TV/EpisodeProviderFromXml.cs
index 89f6810897..1913397d47 100644
--- a/MediaBrowser.Controller/Providers/TV/EpisodeProviderFromXml.cs
+++ b/MediaBrowser.Controller/Providers/TV/EpisodeProviderFromXml.cs
@@ -1,4 +1,5 @@
-using MediaBrowser.Controller.Entities;
+using MediaBrowser.Controller.Configuration;
+using MediaBrowser.Controller.Entities;
using MediaBrowser.Controller.Entities.TV;
using MediaBrowser.Model.Entities;
using System;
@@ -14,7 +15,7 @@ namespace MediaBrowser.Controller.Providers.TV
///
public class EpisodeProviderFromXml : BaseMetadataProvider
{
- public EpisodeProviderFromXml(ILogManager logManager) : base(logManager)
+ public EpisodeProviderFromXml(ILogManager logManager, IServerConfigurationManager configurationManager) : base(logManager, configurationManager)
{
}
diff --git a/MediaBrowser.Controller/Providers/TV/FanArtTVProvider.cs b/MediaBrowser.Controller/Providers/TV/FanArtTVProvider.cs
index 9769d7a3bc..d89545a8d1 100644
--- a/MediaBrowser.Controller/Providers/TV/FanArtTVProvider.cs
+++ b/MediaBrowser.Controller/Providers/TV/FanArtTVProvider.cs
@@ -1,7 +1,9 @@
using MediaBrowser.Common.Extensions;
using MediaBrowser.Common.Net;
+using MediaBrowser.Controller.Configuration;
using MediaBrowser.Controller.Entities;
using MediaBrowser.Controller.Entities.TV;
+using MediaBrowser.Controller.Providers.Movies;
using MediaBrowser.Model.Entities;
using MediaBrowser.Model.Logging;
using MediaBrowser.Model.Net;
@@ -23,8 +25,8 @@ namespace MediaBrowser.Controller.Providers.TV
/// The HTTP client.
protected IHttpClient HttpClient { get; private set; }
- public FanArtTvProvider(IHttpClient httpClient, ILogManager logManager)
- : base(logManager)
+ public FanArtTvProvider(IHttpClient httpClient, ILogManager logManager, IServerConfigurationManager configurationManager)
+ : base(logManager, configurationManager)
{
if (httpClient == null)
{
@@ -46,9 +48,9 @@ namespace MediaBrowser.Controller.Providers.TV
var thumbExists = item.ResolveArgs.ContainsMetaFileByName(THUMB_FILE);
- return (!artExists && Kernel.Instance.Configuration.DownloadTVArt)
- || (!logoExists && Kernel.Instance.Configuration.DownloadTVLogo)
- || (!thumbExists && Kernel.Instance.Configuration.DownloadTVThumb);
+ return (!artExists && ConfigurationManager.Configuration.DownloadTVArt)
+ || (!logoExists && ConfigurationManager.Configuration.DownloadTVLogo)
+ || (!thumbExists && ConfigurationManager.Configuration.DownloadTVThumb);
}
protected override async Task FetchAsyncInternal(BaseItem item, bool force, CancellationToken cancellationToken)
@@ -58,13 +60,13 @@ namespace MediaBrowser.Controller.Providers.TV
var series = (Series)item;
if (ShouldFetch(series, series.ProviderData.GetValueOrDefault(Id, new BaseProviderInfo { ProviderId = Id })))
{
- string language = Kernel.Instance.Configuration.PreferredMetadataLanguage.ToLower();
+ string language = ConfigurationManager.Configuration.PreferredMetadataLanguage.ToLower();
string url = string.Format(FanArtBaseUrl, APIKey, series.GetProviderId(MetadataProviders.Tvdb));
var doc = new XmlDocument();
try
{
- using (var xml = await HttpClient.Get(url, Kernel.Instance.ResourcePools.FanArt, cancellationToken).ConfigureAwait(false))
+ using (var xml = await HttpClient.Get(url, FanArtMovieProvider.Current.FanArtResourcePool, cancellationToken).ConfigureAwait(false))
{
doc.Load(xml);
}
@@ -78,7 +80,7 @@ namespace MediaBrowser.Controller.Providers.TV
if (doc.HasChildNodes)
{
string path;
- if (Kernel.Instance.Configuration.DownloadTVLogo && !series.ResolveArgs.ContainsMetaFileByName(LOGO_FILE))
+ if (ConfigurationManager.Configuration.DownloadTVLogo && !series.ResolveArgs.ContainsMetaFileByName(LOGO_FILE))
{
var node = doc.SelectSingleNode("//fanart/series/clearlogos/clearlogo[@lang = \"" + language + "\"]/@url") ??
doc.SelectSingleNode("//fanart/series/clearlogos/clearlogo/@url");
@@ -88,7 +90,7 @@ namespace MediaBrowser.Controller.Providers.TV
Logger.Debug("FanArtProvider getting ClearLogo for " + series.Name);
try
{
- series.SetImage(ImageType.Logo, await Kernel.Instance.ProviderManager.DownloadAndSaveImage(series, path, LOGO_FILE, Kernel.Instance.ResourcePools.FanArt, cancellationToken).ConfigureAwait(false));
+ series.SetImage(ImageType.Logo, await Kernel.Instance.ProviderManager.DownloadAndSaveImage(series, path, LOGO_FILE, FanArtMovieProvider.Current.FanArtResourcePool, cancellationToken).ConfigureAwait(false));
}
catch (HttpException)
{
@@ -102,7 +104,7 @@ namespace MediaBrowser.Controller.Providers.TV
cancellationToken.ThrowIfCancellationRequested();
- if (Kernel.Instance.Configuration.DownloadTVArt && !series.ResolveArgs.ContainsMetaFileByName(ART_FILE))
+ if (ConfigurationManager.Configuration.DownloadTVArt && !series.ResolveArgs.ContainsMetaFileByName(ART_FILE))
{
var node = doc.SelectSingleNode("//fanart/series/cleararts/clearart[@lang = \"" + language + "\"]/@url") ??
doc.SelectSingleNode("//fanart/series/cleararts/clearart/@url");
@@ -112,7 +114,7 @@ namespace MediaBrowser.Controller.Providers.TV
Logger.Debug("FanArtProvider getting ClearArt for " + series.Name);
try
{
- series.SetImage(ImageType.Art, await Kernel.Instance.ProviderManager.DownloadAndSaveImage(series, path, ART_FILE, Kernel.Instance.ResourcePools.FanArt, cancellationToken).ConfigureAwait(false));
+ series.SetImage(ImageType.Art, await Kernel.Instance.ProviderManager.DownloadAndSaveImage(series, path, ART_FILE, FanArtMovieProvider.Current.FanArtResourcePool, cancellationToken).ConfigureAwait(false));
}
catch (HttpException)
{
@@ -126,7 +128,7 @@ namespace MediaBrowser.Controller.Providers.TV
cancellationToken.ThrowIfCancellationRequested();
- if (Kernel.Instance.Configuration.DownloadTVThumb && !series.ResolveArgs.ContainsMetaFileByName(THUMB_FILE))
+ if (ConfigurationManager.Configuration.DownloadTVThumb && !series.ResolveArgs.ContainsMetaFileByName(THUMB_FILE))
{
var node = doc.SelectSingleNode("//fanart/series/tvthumbs/tvthumb[@lang = \"" + language + "\"]/@url") ??
doc.SelectSingleNode("//fanart/series/tvthumbs/tvthumb/@url");
@@ -136,7 +138,7 @@ namespace MediaBrowser.Controller.Providers.TV
Logger.Debug("FanArtProvider getting ThumbArt for " + series.Name);
try
{
- series.SetImage(ImageType.Disc, await Kernel.Instance.ProviderManager.DownloadAndSaveImage(series, path, THUMB_FILE, Kernel.Instance.ResourcePools.FanArt, cancellationToken).ConfigureAwait(false));
+ series.SetImage(ImageType.Disc, await Kernel.Instance.ProviderManager.DownloadAndSaveImage(series, path, THUMB_FILE, FanArtMovieProvider.Current.FanArtResourcePool, cancellationToken).ConfigureAwait(false));
}
catch (HttpException)
{
diff --git a/MediaBrowser.Controller/Providers/TV/RemoteEpisodeProvider.cs b/MediaBrowser.Controller/Providers/TV/RemoteEpisodeProvider.cs
index 8056ea5c0f..eee43016c6 100644
--- a/MediaBrowser.Controller/Providers/TV/RemoteEpisodeProvider.cs
+++ b/MediaBrowser.Controller/Providers/TV/RemoteEpisodeProvider.cs
@@ -1,4 +1,5 @@
using MediaBrowser.Common.Net;
+using MediaBrowser.Controller.Configuration;
using MediaBrowser.Controller.Entities;
using MediaBrowser.Controller.Entities.TV;
using MediaBrowser.Controller.Extensions;
@@ -27,13 +28,15 @@ namespace MediaBrowser.Controller.Providers.TV
/// The HTTP client.
protected IHttpClient HttpClient { get; private set; }
- public RemoteEpisodeProvider(IHttpClient httpClient, ILogManager logManager)
- : base(logManager)
+ ///
+ /// Initializes a new instance of the class.
+ ///
+ /// The HTTP client.
+ /// The log manager.
+ /// The configuration manager.
+ public RemoteEpisodeProvider(IHttpClient httpClient, ILogManager logManager, IServerConfigurationManager configurationManager)
+ : base(logManager, configurationManager)
{
- if (httpClient == null)
- {
- throw new ArgumentNullException("httpClient");
- }
HttpClient = httpClient;
}
@@ -94,15 +97,15 @@ namespace MediaBrowser.Controller.Providers.TV
var episode = (Episode)item;
var downloadDate = providerInfo.LastRefreshed;
- if (Kernel.Instance.Configuration.MetadataRefreshDays == -1 && downloadDate != DateTime.MinValue)
+ if (ConfigurationManager.Configuration.MetadataRefreshDays == -1 && downloadDate != DateTime.MinValue)
{
return false;
}
if (!item.DontFetchMeta && !HasLocalMeta(episode))
{
- fetch = Kernel.Instance.Configuration.MetadataRefreshDays != -1 &&
- DateTime.Today.Subtract(downloadDate).TotalDays > Kernel.Instance.Configuration.MetadataRefreshDays;
+ fetch = ConfigurationManager.Configuration.MetadataRefreshDays != -1 &&
+ DateTime.Today.Subtract(downloadDate).TotalDays > ConfigurationManager.Configuration.MetadataRefreshDays;
}
return fetch;
@@ -183,12 +186,12 @@ namespace MediaBrowser.Controller.Providers.TV
seasonNumber = "0"; // Specials
}
- var url = string.Format(episodeQuery, TVUtils.TVDBApiKey, seriesId, seasonNumber, episodeNumber, Kernel.Instance.Configuration.PreferredMetadataLanguage);
+ var url = string.Format(episodeQuery, TVUtils.TVDBApiKey, seriesId, seasonNumber, episodeNumber, ConfigurationManager.Configuration.PreferredMetadataLanguage);
var doc = new XmlDocument();
try
{
- using (var result = await HttpClient.Get(url, Kernel.Instance.ResourcePools.TvDb, cancellationToken).ConfigureAwait(false))
+ using (var result = await HttpClient.Get(url, RemoteSeriesProvider.Current.TvDbResourcePool, cancellationToken).ConfigureAwait(false))
{
doc.Load(result);
}
@@ -202,11 +205,11 @@ namespace MediaBrowser.Controller.Providers.TV
//this is basicly just for anime.
if (!doc.HasChildNodes && Int32.Parse(seasonNumber) == 1)
{
- url = string.Format(absEpisodeQuery, TVUtils.TVDBApiKey, seriesId, episodeNumber, Kernel.Instance.Configuration.PreferredMetadataLanguage);
+ url = string.Format(absEpisodeQuery, TVUtils.TVDBApiKey, seriesId, episodeNumber, ConfigurationManager.Configuration.PreferredMetadataLanguage);
try
{
- using (var result = await HttpClient.Get(url, Kernel.Instance.ResourcePools.TvDb, cancellationToken).ConfigureAwait(false))
+ using (var result = await HttpClient.Get(url, RemoteSeriesProvider.Current.TvDbResourcePool, cancellationToken).ConfigureAwait(false))
{
if (result != null) doc.Load(result);
usingAbsoluteData = true;
@@ -226,7 +229,7 @@ namespace MediaBrowser.Controller.Providers.TV
try
{
- episode.PrimaryImagePath = await Kernel.Instance.ProviderManager.DownloadAndSaveImage(episode, TVUtils.BannerUrl + p, Path.GetFileName(p), Kernel.Instance.ResourcePools.TvDb, cancellationToken);
+ episode.PrimaryImagePath = await Kernel.Instance.ProviderManager.DownloadAndSaveImage(episode, TVUtils.BannerUrl + p, Path.GetFileName(p), RemoteSeriesProvider.Current.TvDbResourcePool, cancellationToken);
}
catch (HttpException)
{
@@ -273,7 +276,7 @@ namespace MediaBrowser.Controller.Providers.TV
episode.AddPeople(writers.Split(new[] { '|' }, StringSplitOptions.RemoveEmptyEntries).Select(str => new PersonInfo { Type = "Writer", Name = str }));
}
- if (Kernel.Instance.Configuration.SaveLocalMeta)
+ if (ConfigurationManager.Configuration.SaveLocalMeta)
{
if (!Directory.Exists(episode.MetaLocation)) Directory.CreateDirectory(episode.MetaLocation);
var ms = new MemoryStream();
diff --git a/MediaBrowser.Controller/Providers/TV/RemoteSeasonProvider.cs b/MediaBrowser.Controller/Providers/TV/RemoteSeasonProvider.cs
index ac79817754..71741d2259 100644
--- a/MediaBrowser.Controller/Providers/TV/RemoteSeasonProvider.cs
+++ b/MediaBrowser.Controller/Providers/TV/RemoteSeasonProvider.cs
@@ -1,4 +1,5 @@
using MediaBrowser.Common.Net;
+using MediaBrowser.Controller.Configuration;
using MediaBrowser.Controller.Entities;
using MediaBrowser.Controller.Entities.TV;
using MediaBrowser.Controller.Library;
@@ -24,9 +25,9 @@ namespace MediaBrowser.Controller.Providers.TV
///
/// The HTTP client.
protected IHttpClient HttpClient { get; private set; }
-
- public RemoteSeasonProvider(IHttpClient httpClient, ILogManager logManager)
- : base(logManager)
+
+ public RemoteSeasonProvider(IHttpClient httpClient, ILogManager logManager, IServerConfigurationManager configurationManager)
+ : base(logManager, configurationManager)
{
if (httpClient == null)
{
@@ -77,13 +78,13 @@ namespace MediaBrowser.Controller.Providers.TV
bool fetch = false;
var downloadDate = providerInfo.LastRefreshed;
- if (Kernel.Instance.Configuration.MetadataRefreshDays == -1 && downloadDate != DateTime.MinValue)
+ if (ConfigurationManager.Configuration.MetadataRefreshDays == -1 && downloadDate != DateTime.MinValue)
return false;
if (!HasLocalMeta(item))
{
- fetch = Kernel.Instance.Configuration.MetadataRefreshDays != -1 &&
- DateTime.UtcNow.Subtract(downloadDate).TotalDays > Kernel.Instance.Configuration.MetadataRefreshDays;
+ fetch = ConfigurationManager.Configuration.MetadataRefreshDays != -1 &&
+ DateTime.UtcNow.Subtract(downloadDate).TotalDays > ConfigurationManager.Configuration.MetadataRefreshDays;
}
return fetch;
@@ -152,7 +153,7 @@ namespace MediaBrowser.Controller.Providers.TV
try
{
- using (var imgs = await HttpClient.Get(url, Kernel.Instance.ResourcePools.TvDb, cancellationToken).ConfigureAwait(false))
+ using (var imgs = await HttpClient.Get(url, RemoteSeriesProvider.Current.TvDbResourcePool, cancellationToken).ConfigureAwait(false))
{
images.Load(imgs);
}
@@ -163,7 +164,7 @@ namespace MediaBrowser.Controller.Providers.TV
if (images.HasChildNodes)
{
- if (Kernel.Instance.Configuration.RefreshItemImages || !season.HasLocalImage("folder"))
+ if (ConfigurationManager.Configuration.RefreshItemImages || !season.HasLocalImage("folder"))
{
var n = images.SelectSingleNode("//Banner[BannerType='season'][BannerType2='season'][Season='" + seasonNumber + "']");
if (n != null)
@@ -173,7 +174,7 @@ namespace MediaBrowser.Controller.Providers.TV
try
{
if (n != null)
- season.PrimaryImagePath = await Kernel.Instance.ProviderManager.DownloadAndSaveImage(season, TVUtils.BannerUrl + n.InnerText, "folder" + Path.GetExtension(n.InnerText), Kernel.Instance.ResourcePools.TvDb, cancellationToken).ConfigureAwait(false);
+ season.PrimaryImagePath = await Kernel.Instance.ProviderManager.DownloadAndSaveImage(season, TVUtils.BannerUrl + n.InnerText, "folder" + Path.GetExtension(n.InnerText), RemoteSeriesProvider.Current.TvDbResourcePool, cancellationToken).ConfigureAwait(false);
}
catch (HttpException)
{
@@ -185,7 +186,7 @@ namespace MediaBrowser.Controller.Providers.TV
}
}
- if (Kernel.Instance.Configuration.DownloadTVSeasonBanner && (Kernel.Instance.Configuration.RefreshItemImages || !season.HasLocalImage("banner")))
+ if (ConfigurationManager.Configuration.DownloadTVSeasonBanner && (ConfigurationManager.Configuration.RefreshItemImages || !season.HasLocalImage("banner")))
{
var n = images.SelectSingleNode("//Banner[BannerType='season'][BannerType2='seasonwide'][Season='" + seasonNumber + "']");
if (n != null)
@@ -201,7 +202,7 @@ namespace MediaBrowser.Controller.Providers.TV
TVUtils.BannerUrl + n.InnerText,
"banner" +
Path.GetExtension(n.InnerText),
- Kernel.Instance.ResourcePools.TvDb, cancellationToken).
+ RemoteSeriesProvider.Current.TvDbResourcePool, cancellationToken).
ConfigureAwait(false);
season.SetImage(ImageType.Banner, bannerImagePath);
@@ -217,7 +218,7 @@ namespace MediaBrowser.Controller.Providers.TV
}
}
- if (Kernel.Instance.Configuration.DownloadTVSeasonBackdrops && (Kernel.Instance.Configuration.RefreshItemImages || !season.HasLocalImage("backdrop")))
+ if (ConfigurationManager.Configuration.DownloadTVSeasonBackdrops && (ConfigurationManager.Configuration.RefreshItemImages || !season.HasLocalImage("backdrop")))
{
var n = images.SelectSingleNode("//Banner[BannerType='fanart'][Season='" + seasonNumber + "']");
if (n != null)
@@ -228,7 +229,7 @@ namespace MediaBrowser.Controller.Providers.TV
try
{
if (season.BackdropImagePaths == null) season.BackdropImagePaths = new List();
- season.BackdropImagePaths.Add(await Kernel.Instance.ProviderManager.DownloadAndSaveImage(season, TVUtils.BannerUrl + n.InnerText, "backdrop" + Path.GetExtension(n.InnerText), Kernel.Instance.ResourcePools.TvDb, cancellationToken).ConfigureAwait(false));
+ season.BackdropImagePaths.Add(await Kernel.Instance.ProviderManager.DownloadAndSaveImage(season, TVUtils.BannerUrl + n.InnerText, "backdrop" + Path.GetExtension(n.InnerText), RemoteSeriesProvider.Current.TvDbResourcePool, cancellationToken).ConfigureAwait(false));
}
catch (HttpException)
{
@@ -239,7 +240,7 @@ namespace MediaBrowser.Controller.Providers.TV
}
}
}
- else if (!Kernel.Instance.Configuration.SaveLocalMeta) //if saving local - season will inherit from series
+ else if (!ConfigurationManager.Configuration.SaveLocalMeta) //if saving local - season will inherit from series
{
// not necessarily accurate but will give a different bit of art to each season
var lst = images.SelectNodes("//Banner[BannerType='fanart']");
@@ -263,7 +264,7 @@ namespace MediaBrowser.Controller.Providers.TV
"backdrop" +
Path.GetExtension(
n.InnerText),
- Kernel.Instance.ResourcePools.TvDb, cancellationToken)
+ RemoteSeriesProvider.Current.TvDbResourcePool, cancellationToken)
.ConfigureAwait(false));
}
catch (HttpException)
diff --git a/MediaBrowser.Controller/Providers/TV/RemoteSeriesProvider.cs b/MediaBrowser.Controller/Providers/TV/RemoteSeriesProvider.cs
index 7c65136b61..1d4063cdde 100644
--- a/MediaBrowser.Controller/Providers/TV/RemoteSeriesProvider.cs
+++ b/MediaBrowser.Controller/Providers/TV/RemoteSeriesProvider.cs
@@ -1,5 +1,6 @@
using MediaBrowser.Common.Extensions;
using MediaBrowser.Common.Net;
+using MediaBrowser.Controller.Configuration;
using MediaBrowser.Controller.Entities;
using MediaBrowser.Controller.Entities.TV;
using MediaBrowser.Controller.Extensions;
@@ -23,20 +24,48 @@ namespace MediaBrowser.Controller.Providers.TV
///
class RemoteSeriesProvider : BaseMetadataProvider
{
+ ///
+ /// The tv db
+ ///
+ internal readonly SemaphoreSlim TvDbResourcePool = new SemaphoreSlim(5, 5);
+
+ internal static RemoteSeriesProvider Current { get; private set; }
+
///
/// Gets the HTTP client.
///
/// The HTTP client.
protected IHttpClient HttpClient { get; private set; }
- public RemoteSeriesProvider(IHttpClient httpClient, ILogManager logManager)
- : base(logManager)
+ ///
+ /// Initializes a new instance of the class.
+ ///
+ /// The HTTP client.
+ /// The log manager.
+ /// The configuration manager.
+ /// httpClient
+ public RemoteSeriesProvider(IHttpClient httpClient, ILogManager logManager, IServerConfigurationManager configurationManager)
+ : base(logManager, configurationManager)
{
if (httpClient == null)
{
throw new ArgumentNullException("httpClient");
}
HttpClient = httpClient;
+ Current = this;
+ }
+
+ ///
+ /// Releases unmanaged and - optionally - managed resources.
+ ///
+ /// true to release both managed and unmanaged resources; false to release only unmanaged resources.
+ protected override void Dispose(bool dispose)
+ {
+ if (dispose)
+ {
+ TvDbResourcePool.Dispose();
+ }
+ base.Dispose(dispose);
}
///
@@ -102,15 +131,15 @@ namespace MediaBrowser.Controller.Providers.TV
{
var downloadDate = providerInfo.LastRefreshed;
- if (Kernel.Instance.Configuration.MetadataRefreshDays == -1 && downloadDate != DateTime.MinValue)
+ if (ConfigurationManager.Configuration.MetadataRefreshDays == -1 && downloadDate != DateTime.MinValue)
{
return false;
}
if (item.DontFetchMeta) return false;
- return !HasLocalMeta(item) && (Kernel.Instance.Configuration.MetadataRefreshDays != -1 &&
- DateTime.UtcNow.Subtract(downloadDate).TotalDays > Kernel.Instance.Configuration.MetadataRefreshDays);
+ return !HasLocalMeta(item) && (ConfigurationManager.Configuration.MetadataRefreshDays != -1 &&
+ DateTime.UtcNow.Subtract(downloadDate).TotalDays > ConfigurationManager.Configuration.MetadataRefreshDays);
}
///
@@ -165,12 +194,12 @@ namespace MediaBrowser.Controller.Providers.TV
if (!string.IsNullOrEmpty(seriesId))
{
- string url = string.Format(seriesGet, TVUtils.TVDBApiKey, seriesId, Kernel.Instance.Configuration.PreferredMetadataLanguage);
+ string url = string.Format(seriesGet, TVUtils.TVDBApiKey, seriesId, ConfigurationManager.Configuration.PreferredMetadataLanguage);
var doc = new XmlDocument();
try
{
- using (var xml = await HttpClient.Get(url, Kernel.Instance.ResourcePools.TvDb, cancellationToken).ConfigureAwait(false))
+ using (var xml = await HttpClient.Get(url, TvDbResourcePool, cancellationToken).ConfigureAwait(false))
{
doc.Load(xml);
}
@@ -219,7 +248,7 @@ namespace MediaBrowser.Controller.Providers.TV
//wait for other tasks
await Task.WhenAll(actorTask, imageTask).ConfigureAwait(false);
- if (Kernel.Instance.Configuration.SaveLocalMeta)
+ if (ConfigurationManager.Configuration.SaveLocalMeta)
{
var ms = new MemoryStream();
doc.Save(ms);
@@ -249,7 +278,7 @@ namespace MediaBrowser.Controller.Providers.TV
try
{
- using (var actors = await HttpClient.Get(urlActors, Kernel.Instance.ResourcePools.TvDb, cancellationToken).ConfigureAwait(false))
+ using (var actors = await HttpClient.Get(urlActors, TvDbResourcePool, cancellationToken).ConfigureAwait(false))
{
docActors.Load(actors);
}
@@ -261,7 +290,7 @@ namespace MediaBrowser.Controller.Providers.TV
if (docActors.HasChildNodes)
{
XmlNode actorsNode = null;
- if (Kernel.Instance.Configuration.SaveLocalMeta)
+ if (ConfigurationManager.Configuration.SaveLocalMeta)
{
//add to the main doc for saving
var seriesNode = doc.SelectSingleNode("//Series");
@@ -282,7 +311,7 @@ namespace MediaBrowser.Controller.Providers.TV
{
series.AddPerson(new PersonInfo { Type = PersonType.Actor, Name = actorName, Role = actorRole });
- if (Kernel.Instance.Configuration.SaveLocalMeta && actorsNode != null)
+ if (ConfigurationManager.Configuration.SaveLocalMeta && actorsNode != null)
{
//create in main doc
var personNode = doc.CreateNode(XmlNodeType.Element, "Person", null);
@@ -316,7 +345,7 @@ namespace MediaBrowser.Controller.Providers.TV
try
{
- using (var imgs = await HttpClient.Get(url, Kernel.Instance.ResourcePools.TvDb, cancellationToken).ConfigureAwait(false))
+ using (var imgs = await HttpClient.Get(url, TvDbResourcePool, cancellationToken).ConfigureAwait(false))
{
images.Load(imgs);
}
@@ -327,7 +356,7 @@ namespace MediaBrowser.Controller.Providers.TV
if (images.HasChildNodes)
{
- if (Kernel.Instance.Configuration.RefreshItemImages || !series.HasLocalImage("folder"))
+ if (ConfigurationManager.Configuration.RefreshItemImages || !series.HasLocalImage("folder"))
{
var n = images.SelectSingleNode("//Banner[BannerType='poster']");
if (n != null)
@@ -337,7 +366,7 @@ namespace MediaBrowser.Controller.Providers.TV
{
try
{
- series.PrimaryImagePath = await Kernel.Instance.ProviderManager.DownloadAndSaveImage(series, TVUtils.BannerUrl + n.InnerText, "folder" + Path.GetExtension(n.InnerText), Kernel.Instance.ResourcePools.TvDb, cancellationToken).ConfigureAwait(false);
+ series.PrimaryImagePath = await Kernel.Instance.ProviderManager.DownloadAndSaveImage(series, TVUtils.BannerUrl + n.InnerText, "folder" + Path.GetExtension(n.InnerText), TvDbResourcePool, cancellationToken).ConfigureAwait(false);
}
catch (HttpException)
{
@@ -350,7 +379,7 @@ namespace MediaBrowser.Controller.Providers.TV
}
}
- if (Kernel.Instance.Configuration.DownloadTVBanner && (Kernel.Instance.Configuration.RefreshItemImages || !series.HasLocalImage("banner")))
+ if (ConfigurationManager.Configuration.DownloadTVBanner && (ConfigurationManager.Configuration.RefreshItemImages || !series.HasLocalImage("banner")))
{
var n = images.SelectSingleNode("//Banner[BannerType='series']");
if (n != null)
@@ -360,7 +389,7 @@ namespace MediaBrowser.Controller.Providers.TV
{
try
{
- var bannerImagePath = await Kernel.Instance.ProviderManager.DownloadAndSaveImage(series, TVUtils.BannerUrl + n.InnerText, "banner" + Path.GetExtension(n.InnerText), Kernel.Instance.ResourcePools.TvDb, cancellationToken);
+ var bannerImagePath = await Kernel.Instance.ProviderManager.DownloadAndSaveImage(series, TVUtils.BannerUrl + n.InnerText, "banner" + Path.GetExtension(n.InnerText), TvDbResourcePool, cancellationToken);
series.SetImage(ImageType.Banner, bannerImagePath);
}
@@ -385,11 +414,11 @@ namespace MediaBrowser.Controller.Providers.TV
if (p != null)
{
var bdName = "backdrop" + (bdNo > 0 ? bdNo.ToString() : "");
- if (Kernel.Instance.Configuration.RefreshItemImages || !series.HasLocalImage(bdName))
+ if (ConfigurationManager.Configuration.RefreshItemImages || !series.HasLocalImage(bdName))
{
try
{
- series.BackdropImagePaths.Add(await Kernel.Instance.ProviderManager.DownloadAndSaveImage(series, TVUtils.BannerUrl + p.InnerText, bdName + Path.GetExtension(p.InnerText), Kernel.Instance.ResourcePools.TvDb, cancellationToken).ConfigureAwait(false));
+ series.BackdropImagePaths.Add(await Kernel.Instance.ProviderManager.DownloadAndSaveImage(series, TVUtils.BannerUrl + p.InnerText, bdName + Path.GetExtension(p.InnerText), TvDbResourcePool, cancellationToken).ConfigureAwait(false));
}
catch (HttpException)
{
@@ -400,7 +429,7 @@ namespace MediaBrowser.Controller.Providers.TV
}
}
bdNo++;
- if (bdNo >= Kernel.Instance.Configuration.MaxBackdrops) break;
+ if (bdNo >= ConfigurationManager.Configuration.MaxBackdrops) break;
}
}
}
@@ -463,7 +492,7 @@ namespace MediaBrowser.Controller.Providers.TV
try
{
- using (var results = await HttpClient.Get(url, Kernel.Instance.ResourcePools.TvDb, cancellationToken).ConfigureAwait(false))
+ using (var results = await HttpClient.Get(url, TvDbResourcePool, cancellationToken).ConfigureAwait(false))
{
doc.Load(results);
}
diff --git a/MediaBrowser.Controller/Providers/TV/SeriesProviderFromXml.cs b/MediaBrowser.Controller/Providers/TV/SeriesProviderFromXml.cs
index 450c36e515..f9d409c184 100644
--- a/MediaBrowser.Controller/Providers/TV/SeriesProviderFromXml.cs
+++ b/MediaBrowser.Controller/Providers/TV/SeriesProviderFromXml.cs
@@ -1,4 +1,5 @@
-using MediaBrowser.Controller.Entities;
+using MediaBrowser.Controller.Configuration;
+using MediaBrowser.Controller.Entities;
using MediaBrowser.Controller.Entities.TV;
using MediaBrowser.Model.Entities;
using System;
@@ -14,7 +15,7 @@ namespace MediaBrowser.Controller.Providers.TV
///
public class SeriesProviderFromXml : BaseMetadataProvider
{
- public SeriesProviderFromXml(ILogManager logManager) : base(logManager)
+ public SeriesProviderFromXml(ILogManager logManager, IServerConfigurationManager configurationManager) : base(logManager, configurationManager)
{
}
diff --git a/MediaBrowser.Controller/Updates/InstallationManager.cs b/MediaBrowser.Controller/Updates/InstallationManager.cs
index f67f690aed..9a2733ce03 100644
--- a/MediaBrowser.Controller/Updates/InstallationManager.cs
+++ b/MediaBrowser.Controller/Updates/InstallationManager.cs
@@ -1,4 +1,5 @@
-using MediaBrowser.Common.Events;
+using MediaBrowser.Common;
+using MediaBrowser.Common.Events;
using MediaBrowser.Common.Kernel;
using MediaBrowser.Common.Net;
using MediaBrowser.Common.Plugins;
@@ -182,7 +183,7 @@ namespace MediaBrowser.Controller.Updates
PackageType? packageType = null,
Version applicationVersion = null)
{
- var packages = (await _packageManager.GetAvailablePackages(HttpClient, _networkManager, Kernel.SecurityManager, Kernel.ResourcePools, JsonSerializer, cancellationToken).ConfigureAwait(false)).ToList();
+ var packages = (await _packageManager.GetAvailablePackages(cancellationToken).ConfigureAwait(false)).ToList();
if (packageType.HasValue)
{
@@ -418,7 +419,7 @@ namespace MediaBrowser.Controller.Updates
private async Task InstallPackageInternal(PackageVersionInfo package, IProgress progress, CancellationToken cancellationToken)
{
// Do the install
- await _packageManager.InstallPackage(HttpClient, _logger, Kernel.ResourcePools, progress, Kernel.ApplicationPaths, package, cancellationToken).ConfigureAwait(false);
+ await _packageManager.InstallPackage(progress, package, cancellationToken).ConfigureAwait(false);
// Do plugin-specific processing
if (!(Path.GetExtension(package.targetFilename) ?? "").Equals(".zip", StringComparison.OrdinalIgnoreCase))
diff --git a/MediaBrowser.Model/DTO/BaseItemDto.cs b/MediaBrowser.Model/DTO/BaseItemDto.cs
index c72613d1a8..67c7dabf60 100644
--- a/MediaBrowser.Model/DTO/BaseItemDto.cs
+++ b/MediaBrowser.Model/DTO/BaseItemDto.cs
@@ -245,20 +245,6 @@ namespace MediaBrowser.Model.Dto
[ProtoMember(38)]
public int? RecentlyAddedItemCount { get; set; }
- ///
- /// Gets or sets the recently added un played item count.
- ///
- /// The recently added un played item count.
- [ProtoMember(39)]
- public int? RecentlyAddedUnPlayedItemCount { get; set; }
-
- ///
- /// Gets or sets the resumable item count.
- ///
- /// The resumable item count.
- [ProtoMember(40)]
- public int? ResumableItemCount { get; set; }
-
///
/// Gets or sets the played percentage.
///
@@ -273,13 +259,6 @@ namespace MediaBrowser.Model.Dto
[ProtoMember(42)]
public int? RecursiveItemCount { get; set; }
- ///
- /// Gets or sets the favorite item count.
- ///
- /// The favorite item count.
- [ProtoMember(43)]
- public int? FavoriteItemCount { get; set; }
-
///
/// Gets or sets the child count.
///
@@ -301,13 +280,6 @@ namespace MediaBrowser.Model.Dto
[ProtoMember(46)]
public string SeriesId { get; set; }
- ///
- /// Gets or sets the recently played item count.
- ///
- /// The recently played item count.
- [ProtoMember(47)]
- public int? RecentlyPlayedItemCount { get; set; }
-
///
/// Gets or sets the special feature count.
///
diff --git a/MediaBrowser.Server.Implementations/Configuration/ServerConfigurationManager.cs b/MediaBrowser.Server.Implementations/Configuration/ServerConfigurationManager.cs
new file mode 100644
index 0000000000..cb4c5a6cdd
--- /dev/null
+++ b/MediaBrowser.Server.Implementations/Configuration/ServerConfigurationManager.cs
@@ -0,0 +1,55 @@
+using MediaBrowser.Common.Configuration;
+using MediaBrowser.Common.Implementations.Configuration;
+using MediaBrowser.Controller;
+using MediaBrowser.Controller.Configuration;
+using MediaBrowser.Model.Configuration;
+using MediaBrowser.Model.Logging;
+using MediaBrowser.Model.Serialization;
+using System;
+
+namespace MediaBrowser.Server.Implementations.Configuration
+{
+ ///
+ /// Class ServerConfigurationManager
+ ///
+ public class ServerConfigurationManager : BaseConfigurationManager, IServerConfigurationManager
+ {
+ ///
+ /// Initializes a new instance of the class.
+ ///
+ /// The application paths.
+ /// The log manager.
+ /// The XML serializer.
+ public ServerConfigurationManager(IApplicationPaths applicationPaths, ILogManager logManager, IXmlSerializer xmlSerializer)
+ : base(applicationPaths, logManager, xmlSerializer)
+ {
+ }
+
+ ///
+ /// Gets the type of the configuration.
+ ///
+ /// The type of the configuration.
+ protected override Type ConfigurationType
+ {
+ get { return typeof(ServerConfiguration); }
+ }
+
+ ///
+ /// Gets the application paths.
+ ///
+ /// The application paths.
+ public IServerApplicationPaths ApplicationPaths
+ {
+ get { return (IServerApplicationPaths)CommonApplicationPaths; }
+ }
+
+ ///
+ /// Gets the configuration.
+ ///
+ /// The configuration.
+ public ServerConfiguration Configuration
+ {
+ get { return (ServerConfiguration)CommonConfiguration; }
+ }
+ }
+}
diff --git a/MediaBrowser.Server.Implementations/Library/LibraryManager.cs b/MediaBrowser.Server.Implementations/Library/LibraryManager.cs
index b6e9fec170..c3c48f0993 100644
--- a/MediaBrowser.Server.Implementations/Library/LibraryManager.cs
+++ b/MediaBrowser.Server.Implementations/Library/LibraryManager.cs
@@ -3,6 +3,7 @@ using MediaBrowser.Common.Events;
using MediaBrowser.Common.Extensions;
using MediaBrowser.Common.ScheduledTasks;
using MediaBrowser.Controller;
+using MediaBrowser.Controller.Configuration;
using MediaBrowser.Controller.Entities;
using MediaBrowser.Controller.IO;
using MediaBrowser.Controller.Library;
@@ -90,6 +91,12 @@ namespace MediaBrowser.Server.Implementations.Library
/// The kernel.
private Kernel Kernel { get; set; }
+ ///
+ /// Gets or sets the configuration manager.
+ ///
+ /// The configuration manager.
+ private IServerConfigurationManager ConfigurationManager { get; set; }
+
///
/// Initializes a new instance of the class.
///
@@ -97,14 +104,16 @@ namespace MediaBrowser.Server.Implementations.Library
/// The logger.
/// The task manager.
/// The user manager.
- public LibraryManager(Kernel kernel, ILogger logger, ITaskManager taskManager, IUserManager userManager)
+ /// The configuration manager.
+ public LibraryManager(Kernel kernel, ILogger logger, ITaskManager taskManager, IUserManager userManager, IServerConfigurationManager configurationManager)
{
Kernel = kernel;
_logger = logger;
_taskManager = taskManager;
_userManager = userManager;
+ ConfigurationManager = configurationManager;
- kernel.ConfigurationUpdated += kernel_ConfigurationUpdated;
+ ConfigurationManager.ConfigurationUpdated += kernel_ConfigurationUpdated;
}
///
@@ -222,7 +231,7 @@ namespace MediaBrowser.Server.Implementations.Library
return null;
}
- var args = new ItemResolveArgs
+ var args = new ItemResolveArgs(ConfigurationManager.ApplicationPaths)
{
Parent = parent,
Path = path,
@@ -306,7 +315,7 @@ namespace MediaBrowser.Server.Implementations.Library
/// Cannot create the root folder until plugins have loaded
public AggregateFolder CreateRootFolder()
{
- var rootFolderPath = Kernel.ApplicationPaths.RootFolderPath;
+ var rootFolderPath = ConfigurationManager.ApplicationPaths.RootFolderPath;
var rootFolder = Kernel.ItemRepository.RetrieveItem(rootFolderPath.GetMBId(typeof(AggregateFolder))) as AggregateFolder ?? (AggregateFolder)ResolvePath(rootFolderPath);
// Add in the plug-in folders
@@ -338,7 +347,7 @@ namespace MediaBrowser.Server.Implementations.Library
/// Task{Person}.
private Task GetPerson(string name, CancellationToken cancellationToken, bool allowSlowProviders = false)
{
- return GetImagesByNameItem(Kernel.ApplicationPaths.PeoplePath, name, cancellationToken, allowSlowProviders);
+ return GetImagesByNameItem(ConfigurationManager.ApplicationPaths.PeoplePath, name, cancellationToken, allowSlowProviders);
}
///
@@ -349,7 +358,7 @@ namespace MediaBrowser.Server.Implementations.Library
/// Task{Studio}.
public Task GetStudio(string name, bool allowSlowProviders = false)
{
- return GetImagesByNameItem(Kernel.ApplicationPaths.StudioPath, name, CancellationToken.None, allowSlowProviders);
+ return GetImagesByNameItem(ConfigurationManager.ApplicationPaths.StudioPath, name, CancellationToken.None, allowSlowProviders);
}
///
@@ -360,7 +369,7 @@ namespace MediaBrowser.Server.Implementations.Library
/// Task{Genre}.
public Task GetGenre(string name, bool allowSlowProviders = false)
{
- return GetImagesByNameItem(Kernel.ApplicationPaths.GenrePath, name, CancellationToken.None, allowSlowProviders);
+ return GetImagesByNameItem(ConfigurationManager.ApplicationPaths.GenrePath, name, CancellationToken.None, allowSlowProviders);
}
///
@@ -382,7 +391,7 @@ namespace MediaBrowser.Server.Implementations.Library
throw new ArgumentOutOfRangeException();
}
- return GetImagesByNameItem(Kernel.ApplicationPaths.YearPath, value.ToString(UsCulture), CancellationToken.None, allowSlowProviders);
+ return GetImagesByNameItem(ConfigurationManager.ApplicationPaths.YearPath, value.ToString(UsCulture), CancellationToken.None, allowSlowProviders);
}
///
@@ -612,7 +621,7 @@ namespace MediaBrowser.Server.Implementations.Library
/// IEnumerable{VirtualFolderInfo}.
public IEnumerable GetDefaultVirtualFolders()
{
- return GetView(Kernel.ApplicationPaths.DefaultUserViewsPath);
+ return GetView(ConfigurationManager.ApplicationPaths.DefaultUserViewsPath);
}
///
diff --git a/MediaBrowser.Server.Implementations/Library/Resolvers/Movies/MovieResolver.cs b/MediaBrowser.Server.Implementations/Library/Resolvers/Movies/MovieResolver.cs
index 4dd7aceb44..61ca82f95c 100644
--- a/MediaBrowser.Server.Implementations/Library/Resolvers/Movies/MovieResolver.cs
+++ b/MediaBrowser.Server.Implementations/Library/Resolvers/Movies/MovieResolver.cs
@@ -1,4 +1,5 @@
using MediaBrowser.Common.Extensions;
+using MediaBrowser.Controller;
using MediaBrowser.Controller.Entities;
using MediaBrowser.Controller.Entities.Movies;
using MediaBrowser.Controller.Library;
@@ -16,6 +17,13 @@ namespace MediaBrowser.Server.Implementations.Library.Resolvers.Movies
///
public class MovieResolver : BaseVideoResolver
{
+ private IServerApplicationPaths ApplicationPaths { get; set; }
+
+ public MovieResolver(IServerApplicationPaths appPaths)
+ {
+ ApplicationPaths = appPaths;
+ }
+
///
/// Gets the priority.
///
@@ -149,7 +157,7 @@ namespace MediaBrowser.Server.Implementations.Library.Resolvers.Movies
continue;
}
- var childArgs = new ItemResolveArgs
+ var childArgs = new ItemResolveArgs(ApplicationPaths)
{
FileInfo = child,
Path = child.Path
diff --git a/MediaBrowser.Server.Implementations/Library/UserManager.cs b/MediaBrowser.Server.Implementations/Library/UserManager.cs
index 0490a9cf03..a3a24fb344 100644
--- a/MediaBrowser.Server.Implementations/Library/UserManager.cs
+++ b/MediaBrowser.Server.Implementations/Library/UserManager.cs
@@ -1,6 +1,7 @@
using MediaBrowser.Common.Events;
using MediaBrowser.Common.Extensions;
using MediaBrowser.Controller;
+using MediaBrowser.Controller.Configuration;
using MediaBrowser.Controller.Entities;
using MediaBrowser.Controller.Library;
using MediaBrowser.Model.Connectivity;
@@ -89,15 +90,23 @@ namespace MediaBrowser.Server.Implementations.Library
/// The kernel.
private Kernel Kernel { get; set; }
+ ///
+ /// Gets or sets the configuration manager.
+ ///
+ /// The configuration manager.
+ private IServerConfigurationManager ConfigurationManager { get; set; }
+
///
/// Initializes a new instance of the class.
///
/// The kernel.
/// The logger.
- public UserManager(Kernel kernel, ILogger logger)
+ /// The configuration manager.
+ public UserManager(Kernel kernel, ILogger logger, IServerConfigurationManager configurationManager)
{
_logger = logger;
Kernel = kernel;
+ ConfigurationManager = configurationManager;
}
#region Events
@@ -596,14 +605,14 @@ namespace MediaBrowser.Server.Implementations.Library
var pctIn = Decimal.Divide(positionTicks, item.RunTimeTicks.Value) * 100;
// Don't track in very beginning
- if (pctIn < Kernel.Configuration.MinResumePct)
+ if (pctIn < ConfigurationManager.Configuration.MinResumePct)
{
positionTicks = 0;
incrementPlayCount = false;
}
// If we're at the end, assume completed
- else if (pctIn > Kernel.Configuration.MaxResumePct || positionTicks >= item.RunTimeTicks.Value)
+ else if (pctIn > ConfigurationManager.Configuration.MaxResumePct || positionTicks >= item.RunTimeTicks.Value)
{
positionTicks = 0;
data.Played = true;
@@ -614,7 +623,7 @@ namespace MediaBrowser.Server.Implementations.Library
// Enforce MinResumeDuration
var durationSeconds = TimeSpan.FromTicks(item.RunTimeTicks.Value).TotalSeconds;
- if (durationSeconds < Kernel.Configuration.MinResumeDurationSeconds)
+ if (durationSeconds < ConfigurationManager.Configuration.MinResumeDurationSeconds)
{
positionTicks = 0;
data.Played = true;
diff --git a/MediaBrowser.Server.Implementations/MediaBrowser.Server.Implementations.csproj b/MediaBrowser.Server.Implementations/MediaBrowser.Server.Implementations.csproj
index 05fe1d3abf..bf6046393a 100644
--- a/MediaBrowser.Server.Implementations/MediaBrowser.Server.Implementations.csproj
+++ b/MediaBrowser.Server.Implementations/MediaBrowser.Server.Implementations.csproj
@@ -58,6 +58,7 @@
Properties\SharedVersion.cs
+
diff --git a/MediaBrowser.Server.Implementations/Sqlite/SQLiteDisplayPreferencesRepository.cs b/MediaBrowser.Server.Implementations/Sqlite/SQLiteDisplayPreferencesRepository.cs
index 53a467c1a0..d6a0858afd 100644
--- a/MediaBrowser.Server.Implementations/Sqlite/SQLiteDisplayPreferencesRepository.cs
+++ b/MediaBrowser.Server.Implementations/Sqlite/SQLiteDisplayPreferencesRepository.cs
@@ -1,4 +1,5 @@
-using MediaBrowser.Common.Kernel;
+using MediaBrowser.Common.Configuration;
+using MediaBrowser.Common.Kernel;
using MediaBrowser.Controller.Entities;
using MediaBrowser.Controller.Persistence;
using MediaBrowser.Model.Entities;
diff --git a/MediaBrowser.Server.Implementations/Sqlite/SQLiteItemRepository.cs b/MediaBrowser.Server.Implementations/Sqlite/SQLiteItemRepository.cs
index 24de081f93..87cce1785d 100644
--- a/MediaBrowser.Server.Implementations/Sqlite/SQLiteItemRepository.cs
+++ b/MediaBrowser.Server.Implementations/Sqlite/SQLiteItemRepository.cs
@@ -1,3 +1,4 @@
+using MediaBrowser.Common.Configuration;
using MediaBrowser.Common.Kernel;
using MediaBrowser.Controller.Entities;
using MediaBrowser.Controller.Persistence;
diff --git a/MediaBrowser.Server.Implementations/Sqlite/SQLiteUserDataRepository.cs b/MediaBrowser.Server.Implementations/Sqlite/SQLiteUserDataRepository.cs
index 5787a614a7..64ba4d1e2c 100644
--- a/MediaBrowser.Server.Implementations/Sqlite/SQLiteUserDataRepository.cs
+++ b/MediaBrowser.Server.Implementations/Sqlite/SQLiteUserDataRepository.cs
@@ -1,4 +1,5 @@
-using MediaBrowser.Common.Kernel;
+using MediaBrowser.Common.Configuration;
+using MediaBrowser.Common.Kernel;
using MediaBrowser.Controller.Entities;
using MediaBrowser.Controller.Persistence;
using MediaBrowser.Model.Logging;
diff --git a/MediaBrowser.Server.Implementations/Sqlite/SQLiteUserRepository.cs b/MediaBrowser.Server.Implementations/Sqlite/SQLiteUserRepository.cs
index 1e6f370ebf..89d2900dd2 100644
--- a/MediaBrowser.Server.Implementations/Sqlite/SQLiteUserRepository.cs
+++ b/MediaBrowser.Server.Implementations/Sqlite/SQLiteUserRepository.cs
@@ -1,4 +1,5 @@
-using MediaBrowser.Common.Kernel;
+using MediaBrowser.Common.Configuration;
+using MediaBrowser.Common.Kernel;
using MediaBrowser.Controller.Entities;
using MediaBrowser.Controller.Persistence;
using MediaBrowser.Model.Logging;
diff --git a/MediaBrowser.Server.Implementations/WorldWeatherOnline/WeatherProvider.cs b/MediaBrowser.Server.Implementations/WorldWeatherOnline/WeatherProvider.cs
index 39ac203fc9..ae8b1ff974 100644
--- a/MediaBrowser.Server.Implementations/WorldWeatherOnline/WeatherProvider.cs
+++ b/MediaBrowser.Server.Implementations/WorldWeatherOnline/WeatherProvider.cs
@@ -1,5 +1,4 @@
using MediaBrowser.Common.Net;
-using MediaBrowser.Controller;
using MediaBrowser.Controller.Weather;
using MediaBrowser.Model.Logging;
using MediaBrowser.Model.Serialization;
diff --git a/MediaBrowser.ServerApplication/App.xaml.cs b/MediaBrowser.ServerApplication/App.xaml.cs
index d79b2ff437..470b7fc558 100644
--- a/MediaBrowser.ServerApplication/App.xaml.cs
+++ b/MediaBrowser.ServerApplication/App.xaml.cs
@@ -1,4 +1,5 @@
using System.IO;
+using MediaBrowser.Common.Configuration;
using MediaBrowser.Common.Constants;
using MediaBrowser.Common.Kernel;
using MediaBrowser.Common.Updates;
@@ -71,12 +72,6 @@ namespace MediaBrowser.ServerApplication
///
private Mutex SingleInstanceMutex;
- ///
- /// Gets or sets the kernel.
- ///
- /// The kernel.
- protected IKernel Kernel { get; set; }
-
///
/// Gets or sets the logger.
///
@@ -107,12 +102,6 @@ namespace MediaBrowser.ServerApplication
get { return "MediaBrowser.Server.Uninstall.exe"; }
}
- ///
- /// Gets or sets a value indicating whether [last run at startup value].
- ///
- /// null if [last run at startup value] contains no value, true if [last run at startup value]; otherwise, false.
- private bool? LastRunAtStartupValue { get; set; }
-
///
/// Raises the event.
///
@@ -164,26 +153,17 @@ namespace MediaBrowser.ServerApplication
///
protected async void LoadKernel()
{
- CompositionRoot = new ApplicationHost();
- await CompositionRoot.Init();
-
- Logger = CompositionRoot.Logger;
- Kernel = CompositionRoot.Kernel;
-
try
{
- var win = (MainWindow)CompositionRoot.CreateInstance(typeof(MainWindow));
+ CompositionRoot = new ApplicationHost();
+
+ var win = new MainWindow(CompositionRoot.LogManager, CompositionRoot, CompositionRoot.ServerConfigurationManager);
+
+ Logger = CompositionRoot.LogManager.GetLogger("App");
win.Show();
- var now = DateTime.UtcNow;
-
- Kernel.Init();
-
- var done = (DateTime.UtcNow - now);
- Logger.Info("Kernel.Init completed in {0}{1} minutes and {2} seconds.", done.Hours > 0 ? done.Hours + " Hours " : "", done.Minutes, done.Seconds);
-
- await OnKernelLoaded();
+ await CompositionRoot.Init();
}
catch (Exception ex)
{
@@ -196,41 +176,6 @@ namespace MediaBrowser.ServerApplication
}
}
- ///
- /// Called when [kernel loaded].
- ///
- /// Task.
- protected Task OnKernelLoaded()
- {
- return Task.Run(() =>
- {
- Kernel.ConfigurationUpdated += Kernel_ConfigurationUpdated;
-
- ConfigureAutoRun();
- });
- }
-
- ///
- /// Handles the ConfigurationUpdated event of the Kernel control.
- ///
- /// The source of the event.
- /// The instance containing the event data.
- void Kernel_ConfigurationUpdated(object sender, EventArgs e)
- {
- if (!LastRunAtStartupValue.HasValue || LastRunAtStartupValue.Value != Kernel.Configuration.RunAtStartup)
- {
- ConfigureAutoRun();
- }
- }
-
- ///
- /// Configures the click once startup.
- ///
- private void ConfigureAutoRun()
- {
- CompositionRoot.ConfigureAutoRunAtStartup(Kernel.Configuration.RunAtStartup);
- }
-
///
/// Raises the event.
///
@@ -260,22 +205,14 @@ namespace MediaBrowser.ServerApplication
SingleInstanceMutex = null;
}
- ///
- /// Opens the dashboard.
- ///
- public static void OpenDashboard(User loggedInUser)
- {
- OpenDashboardPage("dashboard.html", loggedInUser);
- }
-
///
/// Opens the dashboard page.
///
/// The page.
- public static void OpenDashboardPage(string page, User loggedInUser)
+ public static void OpenDashboardPage(string page, User loggedInUser, IConfigurationManager configurationManager)
{
- var url = "http://localhost:" + Controller.Kernel.Instance.Configuration.HttpServerPortNumber + "/" +
- Controller.Kernel.Instance.WebApplicationName + "/dashboard/" + page;
+ var url = "http://localhost:" + configurationManager.CommonConfiguration.HttpServerPortNumber + "/" +
+ Kernel.Instance.WebApplicationName + "/dashboard/" + page;
if (loggedInUser != null)
{
diff --git a/MediaBrowser.ServerApplication/ApplicationHost.cs b/MediaBrowser.ServerApplication/ApplicationHost.cs
index fa9ba2b8f0..c36e0fa7fa 100644
--- a/MediaBrowser.ServerApplication/ApplicationHost.cs
+++ b/MediaBrowser.ServerApplication/ApplicationHost.cs
@@ -1,18 +1,16 @@
using MediaBrowser.Api;
+using MediaBrowser.Common;
+using MediaBrowser.Common.Configuration;
using MediaBrowser.Common.Constants;
using MediaBrowser.Common.Implementations;
using MediaBrowser.Common.Implementations.HttpServer;
using MediaBrowser.Common.Implementations.Logging;
-using MediaBrowser.Common.Implementations.NetworkManagement;
using MediaBrowser.Common.Implementations.ScheduledTasks;
-using MediaBrowser.Common.Implementations.Serialization;
-using MediaBrowser.Common.Implementations.ServerManager;
using MediaBrowser.Common.IO;
using MediaBrowser.Common.Kernel;
-using MediaBrowser.Common.Net;
-using MediaBrowser.Common.ScheduledTasks;
using MediaBrowser.Common.Updates;
using MediaBrowser.Controller;
+using MediaBrowser.Controller.Configuration;
using MediaBrowser.Controller.Entities;
using MediaBrowser.Controller.Library;
using MediaBrowser.Controller.Resolvers;
@@ -21,13 +19,12 @@ using MediaBrowser.IsoMounter;
using MediaBrowser.Model.IO;
using MediaBrowser.Model.Logging;
using MediaBrowser.Model.MediaInfo;
-using MediaBrowser.Model.Serialization;
using MediaBrowser.Model.System;
using MediaBrowser.Model.Updates;
using MediaBrowser.Server.Implementations;
using MediaBrowser.Server.Implementations.BdInfo;
+using MediaBrowser.Server.Implementations.Configuration;
using MediaBrowser.Server.Implementations.Library;
-using MediaBrowser.Server.Implementations.Library.Resolvers;
using MediaBrowser.ServerApplication.Implementations;
using MediaBrowser.WebDashboard.Api;
using System;
@@ -43,112 +40,80 @@ namespace MediaBrowser.ServerApplication
///
/// Class CompositionRoot
///
- public class ApplicationHost : BaseApplicationHost, IApplicationHost
+ public class ApplicationHost : BaseApplicationHost
{
///
- /// Gets or sets the kernel.
+ /// The _web socket events
///
- /// The kernel.
- internal Kernel Kernel { get; private set; }
-
- ///
- /// The json serializer
- ///
- private readonly IJsonSerializer _jsonSerializer = new JsonSerializer();
-
- ///
- /// The _XML serializer
- ///
- private readonly IXmlSerializer _xmlSerializer = new XmlSerializer();
-
private WebSocketEvents _webSocketEvents;
///
- /// Gets the server application paths.
+ /// Gets the server kernel.
///
- /// The server application paths.
- protected IServerApplicationPaths ServerApplicationPaths
+ /// The server kernel.
+ protected Kernel ServerKernel
{
- get { return (IServerApplicationPaths)ApplicationPaths; }
+ get { return (Kernel)Kernel; }
}
///
- /// Initializes a new instance of the class.
+ /// Gets the server configuration manager.
///
- /// The logger.
- public ApplicationHost()
- : base()
+ /// The server configuration manager.
+ public IServerConfigurationManager ServerConfigurationManager
{
+ get { return (IServerConfigurationManager)ConfigurationManager; }
}
///
- /// Inits this instance.
+ /// Gets the kernel.
///
- /// Task.
- public override async Task Init()
+ /// IKernel.
+ protected override IKernel GetKernel()
{
- await base.Init().ConfigureAwait(false);
-
- Kernel = new Kernel(this, ServerApplicationPaths, _xmlSerializer, Logger);
-
- var networkManager = new NetworkManager();
-
- var serverManager = new ServerManager(this, Kernel, networkManager, _jsonSerializer, Logger);
-
- var taskManager = new TaskManager(ApplicationPaths, _jsonSerializer, Logger, serverManager);
-
- LogManager.ReloadLogger(Kernel.Configuration.EnableDebugLevelLogging ? LogSeverity.Debug : LogSeverity.Info);
-
- Logger.Info("Version {0} initializing", ApplicationVersion);
-
- RegisterResources(taskManager, networkManager, serverManager);
-
- FindParts();
+ return new Kernel(this, XmlSerializer, LogManager, ServerConfigurationManager);
}
///
- /// Gets the application paths.
+ /// Gets the name of the log file prefix.
///
- /// IApplicationPaths.
- protected override IApplicationPaths GetApplicationPaths()
+ /// The name of the log file prefix.
+ protected override string LogFilePrefixName
{
- return new ServerApplicationPaths();
+ get { return "Server"; }
}
///
- /// Gets the log manager.
+ /// Gets the configuration manager.
///
- /// ILogManager.
- protected override ILogManager GetLogManager()
+ /// IConfigurationManager.
+ protected override IConfigurationManager GetConfigurationManager()
{
- return new NlogManager(ApplicationPaths.LogDirectoryPath, "Server");
+ return new ServerConfigurationManager(ApplicationPaths, LogManager, XmlSerializer);
}
///
/// Registers resources that classes will depend on
///
- protected override void RegisterResources(ITaskManager taskManager, INetworkManager networkManager, IServerManager serverManager)
+ protected override void RegisterResources()
{
- base.RegisterResources(taskManager, networkManager, serverManager);
+ base.RegisterResources();
- RegisterSingleInstance(Kernel);
- RegisterSingleInstance(Kernel);
+ RegisterSingleInstance(ApplicationPaths);
+
+ RegisterSingleInstance(ServerKernel);
+ RegisterSingleInstance(ServerConfigurationManager);
- RegisterSingleInstance(this);
-
-
- RegisterSingleInstance(ServerApplicationPaths);
RegisterSingleInstance(new PismoIsoManager(Logger));
RegisterSingleInstance(new BdInfoExaminer());
RegisterSingleInstance(new DotNetZipClient());
- RegisterSingleInstance(_jsonSerializer);
- RegisterSingleInstance(_xmlSerializer);
RegisterSingleInstance(ServerFactory.CreateServer(this, ProtobufSerializer, Logger, "Media Browser", "index.html"), false);
- var userManager = new UserManager(Kernel, Logger);
+ var userManager = new UserManager(ServerKernel, Logger, ServerConfigurationManager);
+
RegisterSingleInstance(userManager);
- RegisterSingleInstance(new LibraryManager(Kernel, Logger, taskManager, userManager));
+ RegisterSingleInstance(new LibraryManager(ServerKernel, Logger, TaskManager, userManager, ServerConfigurationManager));
}
///
@@ -160,15 +125,15 @@ namespace MediaBrowser.ServerApplication
Resolve().AddParts(GetExports(), GetExports(), GetExports(), GetExports());
- Kernel.InstallationManager = (InstallationManager)CreateInstance(typeof(InstallationManager));
+ ServerKernel.InstallationManager = (InstallationManager)CreateInstance(typeof(InstallationManager));
- _webSocketEvents = new WebSocketEvents(Resolve(), Resolve(), Resolve(), Resolve(), Resolve(), Kernel.InstallationManager);
+ _webSocketEvents = new WebSocketEvents(Resolve(), Resolve(), Resolve(), Resolve(), Resolve(), ServerKernel.InstallationManager);
}
///
/// Restarts this instance.
///
- public void Restart()
+ public override void Restart()
{
App.Instance.Restart();
}
@@ -177,9 +142,9 @@ namespace MediaBrowser.ServerApplication
/// Gets or sets a value indicating whether this instance can self update.
///
/// true if this instance can self update; otherwise, false.
- public bool CanSelfUpdate
+ public override bool CanSelfUpdate
{
- get { return Kernel.Configuration.EnableAutoUpdate; }
+ get { return ConfigurationManager.CommonConfiguration.EnableAutoUpdate; }
}
///
@@ -188,11 +153,11 @@ namespace MediaBrowser.ServerApplication
/// The cancellation token.
/// The progress.
/// Task{CheckForUpdateResult}.
- public async Task CheckForApplicationUpdate(CancellationToken cancellationToken, IProgress progress)
+ public async override Task CheckForApplicationUpdate(CancellationToken cancellationToken, IProgress progress)
{
var pkgManager = Resolve();
- var availablePackages = await pkgManager.GetAvailablePackages(Resolve(), Resolve(), Kernel.SecurityManager, Kernel.ResourcePools, Resolve(), CancellationToken.None).ConfigureAwait(false);
- var version = Kernel.InstallationManager.GetLatestCompatibleVersion(availablePackages, Constants.MBServerPkgName, Kernel.Configuration.SystemUpdateLevel);
+ var availablePackages = await pkgManager.GetAvailablePackages(CancellationToken.None).ConfigureAwait(false);
+ var version = ServerKernel.InstallationManager.GetLatestCompatibleVersion(availablePackages, Constants.MBServerPkgName, ConfigurationManager.CommonConfiguration.SystemUpdateLevel);
return version != null ? new CheckForUpdateResult { AvailableVersion = version.version, IsUpdateAvailable = version.version > ApplicationVersion, Package = version } :
new CheckForUpdateResult { AvailableVersion = ApplicationVersion, IsUpdateAvailable = false };
@@ -205,10 +170,10 @@ namespace MediaBrowser.ServerApplication
/// The cancellation token.
/// The progress.
/// Task.
- public Task UpdateApplication(PackageVersionInfo package, CancellationToken cancellationToken, IProgress progress)
+ public override Task UpdateApplication(PackageVersionInfo package, CancellationToken cancellationToken, IProgress progress)
{
var pkgManager = Resolve();
- return pkgManager.InstallPackage(Resolve(), Resolve(), Kernel.ResourcePools, progress, Kernel.ApplicationPaths, package, cancellationToken);
+ return pkgManager.InstallPackage(progress, package, cancellationToken);
}
///
@@ -254,7 +219,7 @@ namespace MediaBrowser.ServerApplication
///
/// Shuts down.
///
- public void Shutdown()
+ public override void Shutdown()
{
App.Instance.Dispatcher.Invoke(App.Instance.Shutdown);
}
diff --git a/MediaBrowser.ServerApplication/LibraryExplorer.xaml.cs b/MediaBrowser.ServerApplication/LibraryExplorer.xaml.cs
index 2c07effde3..d15865485b 100644
--- a/MediaBrowser.ServerApplication/LibraryExplorer.xaml.cs
+++ b/MediaBrowser.ServerApplication/LibraryExplorer.xaml.cs
@@ -1,5 +1,4 @@
-using MediaBrowser.Common.Kernel;
-using MediaBrowser.Controller;
+using MediaBrowser.Common;
using MediaBrowser.Controller.Entities;
using MediaBrowser.Controller.Entities.Movies;
using MediaBrowser.Controller.Entities.TV;
@@ -78,11 +77,10 @@ namespace MediaBrowser.ServerApplication
//this whole async thing doesn't really work in this instance since all my work pretty much needs to be on the UI thread...
Cursor = Cursors.Wait;
await Task.Run(() =>
- {
- IEnumerable children;
- children = CurrentUser.Name == "Physical" ? _libraryManager.RootFolder.Children.OrderBy(i => i.SortName) : _libraryManager.RootFolder.GetChildren(CurrentUser, sortBy: LocalizedStrings.Instance.GetString("NameDispPref"));
+ {
+ IEnumerable children = CurrentUser.Name == "Physical" ? _libraryManager.RootFolder.Children.OrderBy(i => i.SortName) : _libraryManager.RootFolder.GetChildren(CurrentUser, sortBy: LocalizedStrings.Instance.GetString("NameDispPref"));
- foreach (Folder folder in children)
+ foreach (Folder folder in children)
{
var currentFolder = folder;
@@ -96,7 +94,7 @@ namespace MediaBrowser.ServerApplication
tvwLibrary.Items.Add(node);
}, CancellationToken.None, TaskCreationOptions.None, ui);
}
- });
+ });
lblLoading.Visibility = Visibility.Hidden;
Cursor = Cursors.Arrow;
diff --git a/MediaBrowser.ServerApplication/Logging/LogWindow.xaml.cs b/MediaBrowser.ServerApplication/Logging/LogWindow.xaml.cs
index fca9784861..75ef69924b 100644
--- a/MediaBrowser.ServerApplication/Logging/LogWindow.xaml.cs
+++ b/MediaBrowser.ServerApplication/Logging/LogWindow.xaml.cs
@@ -1,5 +1,4 @@
-using MediaBrowser.Common.Kernel;
-using NLog;
+using NLog;
using NLog.Config;
using NLog.Targets;
using System.ComponentModel;
@@ -18,20 +17,15 @@ namespace MediaBrowser.ServerApplication.Logging
/// The _ui thread
///
private readonly TaskScheduler _uiThread;
- ///
- /// The _kernel
- ///
- private readonly IKernel _kernel;
///
/// Initializes a new instance of the class.
///
/// The kernel.
- public LogWindow(IKernel kernel)
+ public LogWindow()
{
InitializeComponent();
_uiThread = TaskScheduler.FromCurrentSynchronizationContext();
- _kernel = kernel;
Loaded += LogWindow_Loaded;
}
@@ -94,7 +88,7 @@ namespace MediaBrowser.ServerApplication.Logging
target.Name = name;
config.AddTarget(name, target);
- var level = _kernel.Configuration.EnableDebugLevelLogging ? LogLevel.Debug : LogLevel.Info;
+ var level = LogLevel.Debug;
var rule = new LoggingRule("*", level, target);
config.LoggingRules.Add(rule);
diff --git a/MediaBrowser.ServerApplication/MainWindow.xaml.cs b/MediaBrowser.ServerApplication/MainWindow.xaml.cs
index 0d0d2d54bb..9043e007f2 100644
--- a/MediaBrowser.ServerApplication/MainWindow.xaml.cs
+++ b/MediaBrowser.ServerApplication/MainWindow.xaml.cs
@@ -1,5 +1,7 @@
-using MediaBrowser.Common.Kernel;
+using MediaBrowser.Common;
using MediaBrowser.Controller;
+using MediaBrowser.Controller.Configuration;
+using MediaBrowser.Controller.Entities;
using MediaBrowser.Controller.Library;
using MediaBrowser.Model.Logging;
using MediaBrowser.ServerApplication.Logging;
@@ -31,6 +33,11 @@ namespace MediaBrowser.ServerApplication
/// The _log manager
///
private readonly ILogManager _logManager;
+
+ ///
+ /// The _configuration manager
+ ///
+ private readonly IServerConfigurationManager _configurationManager;
///
/// Initializes a new instance of the class.
@@ -39,16 +46,25 @@ namespace MediaBrowser.ServerApplication
/// The logger.
/// The app host.
/// logger
- public MainWindow(ILogManager logManager, IApplicationHost appHost)
+ public MainWindow(ILogManager logManager, IApplicationHost appHost, IServerConfigurationManager configurationManager)
{
if (logManager == null)
{
throw new ArgumentNullException("logManager");
}
+ if (appHost == null)
+ {
+ throw new ArgumentNullException("appHost");
+ }
+ if (configurationManager == null)
+ {
+ throw new ArgumentNullException("configurationManager");
+ }
_logger = logManager.GetLogger("MainWindow");
_appHost = appHost;
_logManager = logManager;
+ _configurationManager = configurationManager;
InitializeComponent();
@@ -67,7 +83,7 @@ namespace MediaBrowser.ServerApplication
Instance_ConfigurationUpdated(null, EventArgs.Empty);
_logManager.LoggerLoaded += LoadLogWindow;
- Kernel.Instance.ConfigurationUpdated += Instance_ConfigurationUpdated;
+ _configurationManager.ConfigurationUpdated += Instance_ConfigurationUpdated;
}
///
@@ -79,7 +95,7 @@ namespace MediaBrowser.ServerApplication
{
Dispatcher.InvokeAsync(() =>
{
- var developerToolsVisibility = Kernel.Instance.Configuration.EnableDeveloperTools
+ var developerToolsVisibility = _configurationManager.Configuration.EnableDeveloperTools
? Visibility.Visible
: Visibility.Collapsed;
@@ -89,9 +105,9 @@ namespace MediaBrowser.ServerApplication
var logWindow = App.Instance.Windows.OfType().FirstOrDefault();
- if ((logWindow == null && Kernel.Instance.Configuration.ShowLogWindow) || (logWindow != null && !Kernel.Instance.Configuration.ShowLogWindow))
+ if ((logWindow == null && _configurationManager.Configuration.ShowLogWindow) || (logWindow != null && !_configurationManager.Configuration.ShowLogWindow))
{
- _logManager.ReloadLogger(Kernel.Instance.Configuration.EnableDebugLevelLogging ? LogSeverity.Debug : LogSeverity.Info);
+ _logManager.ReloadLogger(_configurationManager.Configuration.EnableDebugLevelLogging ? LogSeverity.Debug : LogSeverity.Info);
}
});
}
@@ -107,16 +123,16 @@ namespace MediaBrowser.ServerApplication
Dispatcher.InvokeAsync(() =>
{
// Add our log window if specified
- if (Kernel.Instance.Configuration.ShowLogWindow)
+ if (_configurationManager.Configuration.ShowLogWindow)
{
- Trace.Listeners.Add(new WindowTraceListener(new LogWindow(Kernel.Instance)));
+ Trace.Listeners.Add(new WindowTraceListener(new LogWindow()));
}
else
{
Trace.Listeners.Remove("MBLogWindow");
}
// Set menu option indicator
- cmShowLogWindow.IsChecked = Kernel.Instance.Configuration.ShowLogWindow;
+ cmShowLogWindow.IsChecked = _configurationManager.Configuration.ShowLogWindow;
}, DispatcherPriority.Normal);
}
@@ -142,7 +158,7 @@ namespace MediaBrowser.ServerApplication
/// The instance containing the event data.
void cmdApiDocs_Click(object sender, EventArgs e)
{
- App.OpenUrl("http://localhost:" + Kernel.Instance.Configuration.HttpServerPortNumber + "/" +
+ App.OpenUrl("http://localhost:" + _configurationManager.Configuration.HttpServerPortNumber + "/" +
Kernel.Instance.WebApplicationName + "/metadata");
}
@@ -190,9 +206,17 @@ namespace MediaBrowser.ServerApplication
private void cmOpenDashboard_click(object sender, RoutedEventArgs e)
{
var user = _appHost.Resolve().Users.FirstOrDefault(u => u.Configuration.IsAdministrator);
- App.OpenDashboard(user);
+ OpenDashboard(user);
}
+ ///
+ /// Opens the dashboard.
+ ///
+ private void OpenDashboard(User loggedInUser)
+ {
+ App.OpenDashboardPage("dashboard.html", loggedInUser, _configurationManager);
+ }
+
///
/// Handles the click event of the cmVisitCT control.
///
@@ -211,7 +235,7 @@ namespace MediaBrowser.ServerApplication
private void cmdBrowseLibrary_click(object sender, RoutedEventArgs e)
{
var user = _appHost.Resolve().Users.FirstOrDefault(u => u.Configuration.IsAdministrator);
- App.OpenDashboardPage("index.html", user);
+ App.OpenDashboardPage("index.html", user, _configurationManager);
}
///
@@ -241,8 +265,8 @@ namespace MediaBrowser.ServerApplication
/// The instance containing the event data.
private void CmShowLogWindow_click(object sender, RoutedEventArgs e)
{
- Kernel.Instance.Configuration.ShowLogWindow = !Kernel.Instance.Configuration.ShowLogWindow;
- Kernel.Instance.SaveConfiguration();
+ _configurationManager.Configuration.ShowLogWindow = !_configurationManager.Configuration.ShowLogWindow;
+ _configurationManager.SaveConfiguration();
LoadLogWindow(sender, e);
}
diff --git a/MediaBrowser.ServerApplication/StartupWizard.cs b/MediaBrowser.ServerApplication/StartupWizard.cs
index c5e8c1c993..57a90ea814 100644
--- a/MediaBrowser.ServerApplication/StartupWizard.cs
+++ b/MediaBrowser.ServerApplication/StartupWizard.cs
@@ -1,4 +1,5 @@
-using MediaBrowser.Common.Kernel;
+using MediaBrowser.Common;
+using MediaBrowser.Common.Configuration;
using MediaBrowser.Controller.Library;
using MediaBrowser.Controller.Plugins;
using System.Linq;
@@ -19,15 +20,18 @@ namespace MediaBrowser.ServerApplication
///
private readonly IUserManager _userManager;
+ private readonly IConfigurationManager _configurationManager;
+
///
/// Initializes a new instance of the class.
///
/// The app host.
/// The user manager.
- public StartupWizard(IApplicationHost appHost, IUserManager userManager)
+ public StartupWizard(IApplicationHost appHost, IUserManager userManager, IConfigurationManager configurationManager)
{
_appHost = appHost;
_userManager = userManager;
+ _configurationManager = configurationManager;
}
///
@@ -48,7 +52,7 @@ namespace MediaBrowser.ServerApplication
{
var user = _userManager.Users.FirstOrDefault(u => u.Configuration.IsAdministrator);
- App.OpenDashboardPage("wizardStart.html", user);
+ App.OpenDashboardPage("wizardStart.html", user, _configurationManager);
}
///
diff --git a/MediaBrowser.WebDashboard/Api/DashboardService.cs b/MediaBrowser.WebDashboard/Api/DashboardService.cs
index 18ca7ef24e..7cf6b28738 100644
--- a/MediaBrowser.WebDashboard/Api/DashboardService.cs
+++ b/MediaBrowser.WebDashboard/Api/DashboardService.cs
@@ -107,9 +107,7 @@ namespace MediaBrowser.WebDashboard.Api
/// System.Object.
public object Get(GetDashboardInfo request)
{
- var kernel = (Kernel)Kernel;
-
- return GetDashboardInfo(kernel, Logger, _taskManager, _userManager);
+ return GetDashboardInfo(Kernel.Instance, Logger, _taskManager, _userManager);
}
///
@@ -149,9 +147,7 @@ namespace MediaBrowser.WebDashboard.Api
/// System.Object.
public object Get(GetDashboardConfigurationPage request)
{
- var kernel = (Kernel)Kernel;
-
- var page = kernel.PluginConfigurationPages.First(p => p.Name.Equals(request.Name, StringComparison.OrdinalIgnoreCase));
+ var page = Kernel.Instance.PluginConfigurationPages.First(p => p.Name.Equals(request.Name, StringComparison.OrdinalIgnoreCase));
return ToStaticResult(page.Version.GetMD5(), page.DateLastModified, null, MimeTypes.GetMimeType("page.html"), () => ModifyHtml(page.GetHtmlStream()));
}
@@ -163,9 +159,7 @@ namespace MediaBrowser.WebDashboard.Api
/// System.Object.
public object Get(GetDashboardConfigurationPages request)
{
- var kernel = (Kernel)Kernel;
-
- var pages = kernel.PluginConfigurationPages;
+ var pages = Kernel.Instance.PluginConfigurationPages;
if (request.PageType.HasValue)
{