blob: d6c13ce380ba9273534ce3f50e672c570dcfdb0e (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
|
using System.Configuration;
using System.IO;
using System.Reflection;
using MediaBrowser.Common.Configuration;
using MediaBrowser.Common.Json;
using MediaBrowser.Common.Logging;
using MediaBrowser.Common.Net;
using MediaBrowser.Common.Plugins;
namespace MediaBrowser.Common.Kernel
{
/// <summary>
/// Represents a shared base kernel for both the UI and server apps
/// </summary>
public abstract class BaseKernel<TConfigurationType>
where TConfigurationType : BaseConfiguration, new()
{
/// <summary>
/// Gets the path to the program data folder
/// </summary>
public string ProgramDataPath { get; private set; }
/// <summary>
/// Gets the current configuration
/// </summary>
public TConfigurationType Configuration { get; private set; }
/// <summary>
/// Both the UI and server will have a built-in HttpServer.
/// People will inevitably want remote control apps so it's needed in the UI too.
/// </summary>
public HttpServer HttpServer { get; private set; }
public PluginController PluginController { get; private set; }
/// <summary>
/// Gets the kernel context. The UI kernel will have to override this.
/// </summary>
protected KernelContext KernelContext { get { return KernelContext.Server; } }
protected virtual string HttpServerUrlPrefix
{
get
{
return "http://+:" + Configuration.HttpServerPortNumber + "/mediabrowser/";
}
}
public BaseKernel()
{
ProgramDataPath = GetProgramDataPath();
PluginController = new PluginController() { PluginsPath = Path.Combine(ProgramDataPath, "Plugins") };
Logger.LoggerInstance = new FileLogger(Path.Combine(ProgramDataPath, "Logs"));
}
public virtual void Init()
{
ReloadConfiguration();
ReloadHttpServer();
ReloadPlugins();
}
/// <summary>
/// Gets the path to the application's ProgramDataFolder
/// </summary>
/// <returns></returns>
private string GetProgramDataPath()
{
string programDataPath = ConfigurationManager.AppSettings["ProgramDataPath"];
// If it's a relative path, e.g. "..\"
if (!Path.IsPathRooted(programDataPath))
{
string path = Assembly.GetExecutingAssembly().Location;
path = Path.GetDirectoryName(path);
programDataPath = Path.Combine(path, programDataPath);
programDataPath = Path.GetFullPath(programDataPath);
}
if (!Directory.Exists(programDataPath))
{
Directory.CreateDirectory(programDataPath);
}
return programDataPath;
}
private void ReloadConfiguration()
{
// Deserialize config
Configuration = GetConfiguration(ProgramDataPath);
Logger.LoggerInstance.LogSeverity = Configuration.LogSeverity;
}
private void ReloadHttpServer()
{
if (HttpServer != null)
{
HttpServer.Dispose();
}
HttpServer = new HttpServer("http://+:" + Configuration.HttpServerPortNumber + "/mediabrowser/");
}
protected virtual void ReloadPlugins()
{
// Find plugins
PluginController.Init(KernelContext);
}
private static TConfigurationType GetConfiguration(string directory)
{
string file = Path.Combine(directory, "config.js");
if (!File.Exists(file))
{
return new TConfigurationType();
}
return JsonSerializer.DeserializeFromFile<TConfigurationType>(file);
}
}
}
|