add environment info

This commit is contained in:
Luke Pulverenti 2016-11-04 15:51:59 -04:00
parent 72aaecb279
commit 67ad1db6b7
12 changed files with 142 additions and 50 deletions

View File

@ -29,6 +29,7 @@ using MediaBrowser.Common.Extensions;
using Emby.Common.Implementations.Cryptography; using Emby.Common.Implementations.Cryptography;
using Emby.Common.Implementations.Diagnostics; using Emby.Common.Implementations.Diagnostics;
using Emby.Common.Implementations.Net; using Emby.Common.Implementations.Net;
using Emby.Common.Implementations.EnvironmentInfo;
using Emby.Common.Implementations.Threading; using Emby.Common.Implementations.Threading;
using MediaBrowser.Common; using MediaBrowser.Common;
using MediaBrowser.Common.IO; using MediaBrowser.Common.IO;
@ -171,6 +172,8 @@ namespace Emby.Common.Implementations
protected ICryptographyProvider CryptographyProvider = new CryptographyProvider(); protected ICryptographyProvider CryptographyProvider = new CryptographyProvider();
protected IEnvironmentInfo EnvironmentInfo = new Emby.Common.Implementations.EnvironmentInfo.EnvironmentInfo();
private DeviceId _deviceId; private DeviceId _deviceId;
public string SystemId public string SystemId
{ {
@ -187,16 +190,7 @@ namespace Emby.Common.Implementations
public virtual string OperatingSystemDisplayName public virtual string OperatingSystemDisplayName
{ {
get get { return EnvironmentInfo.OperatingSystemName; }
{
#if NET46
return Environment.OSVersion.VersionString;
#endif
#if NETSTANDARD1_6
return System.Runtime.InteropServices.RuntimeInformation.OSDescription;
#endif
return "Operating System";
}
} }
public IMemoryStreamProvider MemoryStreamProvider { get; set; } public IMemoryStreamProvider MemoryStreamProvider { get; set; }
@ -216,7 +210,7 @@ namespace Emby.Common.Implementations
// hack alert, until common can target .net core // hack alert, until common can target .net core
BaseExtensions.CryptographyProvider = CryptographyProvider; BaseExtensions.CryptographyProvider = CryptographyProvider;
XmlSerializer = new XmlSerializer(fileSystem, logManager.GetLogger("XmlSerializer")); XmlSerializer = new MyXmlSerializer(fileSystem, logManager.GetLogger("XmlSerializer"));
FailedAssemblies = new List<string>(); FailedAssemblies = new List<string>();
ApplicationPaths = applicationPaths; ApplicationPaths = applicationPaths;
@ -534,6 +528,7 @@ return null;
RegisterSingleInstance(Logger); RegisterSingleInstance(Logger);
RegisterSingleInstance(TaskManager); RegisterSingleInstance(TaskManager);
RegisterSingleInstance(EnvironmentInfo);
RegisterSingleInstance(FileSystemManager); RegisterSingleInstance(FileSystemManager);

View File

@ -0,0 +1,70 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices;
using System.Threading.Tasks;
using MediaBrowser.Model.System;
namespace Emby.Common.Implementations.EnvironmentInfo
{
public class EnvironmentInfo : IEnvironmentInfo
{
public MediaBrowser.Model.System.OperatingSystem OperatingSystem
{
get
{
#if NET46
switch (Environment.OSVersion.Platform)
{
case PlatformID.MacOSX:
return MediaBrowser.Model.System.OperatingSystem.OSX;
case PlatformID.Win32NT:
return MediaBrowser.Model.System.OperatingSystem.Windows;
case PlatformID.Unix:
return MediaBrowser.Model.System.OperatingSystem.Linux;
}
#elif NETSTANDARD1_6
if (System.Runtime.InteropServices.RuntimeInformation.IsOSPlatform(OSPlatform.OSX))
{
return OperatingSystem.OSX;
}
if (System.Runtime.InteropServices.RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
{
return OperatingSystem.Windows;
}
if (System.Runtime.InteropServices.RuntimeInformation.IsOSPlatform(OSPlatform.Linux))
{
return OperatingSystem.Linux;
}
#endif
return MediaBrowser.Model.System.OperatingSystem.Windows;
}
}
public string OperatingSystemName
{
get
{
#if NET46
return Environment.OSVersion.Platform.ToString();
#elif NETSTANDARD1_6
return System.Runtime.InteropServices.RuntimeInformation.OSDescription;
#endif
return "Operating System";
}
}
public string OperatingSystemVersion
{
get
{
#if NET46
return Environment.OSVersion.Version.ToString() + " " + Environment.OSVersion.ServicePack.ToString();
#elif NETSTANDARD1_6
return System.Runtime.InteropServices.RuntimeInformation.FrameworkDescription;
#endif
return "1.0";
}
}
}
}

View File

@ -40,12 +40,11 @@ namespace Emby.Common.Implementations.Net
/// Creates a new UDP socket and binds it to the specified local port. /// Creates a new UDP socket and binds it to the specified local port.
/// </summary> /// </summary>
/// <param name="localPort">An integer specifying the local port to bind the socket to.</param> /// <param name="localPort">An integer specifying the local port to bind the socket to.</param>
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Reliability", "CA2000:Dispose objects before losing scope", Justification = "The purpose of this method is to create and returns a disposable result, it is up to the caller to dispose it when they are done with it.")]
public IUdpSocket CreateUdpSocket(int localPort) public IUdpSocket CreateUdpSocket(int localPort)
{ {
if (localPort < 0) throw new ArgumentException("localPort cannot be less than zero.", "localPort"); if (localPort < 0) throw new ArgumentException("localPort cannot be less than zero.", "localPort");
var retVal = new Socket(System.Net.Sockets.AddressFamily.InterNetwork, System.Net.Sockets.SocketType.Dgram, System.Net.Sockets.ProtocolType.Udp); var retVal = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
try try
{ {
retVal.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true); retVal.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
@ -65,12 +64,11 @@ namespace Emby.Common.Implementations.Net
/// </summary> /// </summary>
/// <param name="localPort">An integer specifying the local port to bind the socket to.</param> /// <param name="localPort">An integer specifying the local port to bind the socket to.</param>
/// <returns>An implementation of the <see cref="IUdpSocket"/> interface used by RSSDP components to perform socket operations.</returns> /// <returns>An implementation of the <see cref="IUdpSocket"/> interface used by RSSDP components to perform socket operations.</returns>
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Reliability", "CA2000:Dispose objects before losing scope", Justification = "The purpose of this method is to create and returns a disposable result, it is up to the caller to dispose it when they are done with it.")]
public IUdpSocket CreateSsdpUdpSocket(int localPort) public IUdpSocket CreateSsdpUdpSocket(int localPort)
{ {
if (localPort < 0) throw new ArgumentException("localPort cannot be less than zero.", "localPort"); if (localPort < 0) throw new ArgumentException("localPort cannot be less than zero.", "localPort");
var retVal = new Socket(System.Net.Sockets.AddressFamily.InterNetwork, System.Net.Sockets.SocketType.Dgram, System.Net.Sockets.ProtocolType.Udp); var retVal = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
try try
{ {
retVal.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true); retVal.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
@ -94,7 +92,6 @@ namespace Emby.Common.Implementations.Net
/// <param name="multicastTimeToLive">The multicast time to live value for the socket.</param> /// <param name="multicastTimeToLive">The multicast time to live value for the socket.</param>
/// <param name="localPort">The number of the local port to bind to.</param> /// <param name="localPort">The number of the local port to bind to.</param>
/// <returns></returns> /// <returns></returns>
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "ip"), System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Reliability", "CA2000:Dispose objects before losing scope", Justification = "The purpose of this method is to create and returns a disposable result, it is up to the caller to dispose it when they are done with it.")]
public IUdpSocket CreateUdpMulticastSocket(string ipAddress, int multicastTimeToLive, int localPort) public IUdpSocket CreateUdpMulticastSocket(string ipAddress, int multicastTimeToLive, int localPort)
{ {
if (ipAddress == null) throw new ArgumentNullException("ipAddress"); if (ipAddress == null) throw new ArgumentNullException("ipAddress");

View File

@ -17,14 +17,14 @@ namespace Emby.Common.Implementations.Net
#region Fields #region Fields
private System.Net.Sockets.Socket _Socket; private Socket _Socket;
private int _LocalPort; private int _LocalPort;
#endregion #endregion
#region Constructors #region Constructors
public UdpSocket(System.Net.Sockets.Socket socket, int localPort, IPAddress ip) public UdpSocket(Socket socket, int localPort, IPAddress ip)
{ {
if (socket == null) throw new ArgumentNullException("socket"); if (socket == null) throw new ArgumentNullException("socket");
@ -46,12 +46,12 @@ namespace Emby.Common.Implementations.Net
var tcs = new TaskCompletionSource<SocketReceiveResult>(); var tcs = new TaskCompletionSource<SocketReceiveResult>();
System.Net.EndPoint receivedFromEndPoint = new IPEndPoint(IPAddress.Any, 0); EndPoint receivedFromEndPoint = new IPEndPoint(IPAddress.Any, 0);
var state = new AsyncReceiveState(_Socket, receivedFromEndPoint); var state = new AsyncReceiveState(_Socket, receivedFromEndPoint);
state.TaskCompletionSource = tcs; state.TaskCompletionSource = tcs;
#if NETSTANDARD1_6 #if NETSTANDARD1_6
_Socket.ReceiveFromAsync(new System.ArraySegment<Byte>(state.Buffer), System.Net.Sockets.SocketFlags.None, state.EndPoint) _Socket.ReceiveFromAsync(new ArraySegment<Byte>(state.Buffer),SocketFlags.None, state.EndPoint)
.ContinueWith((task, asyncState) => .ContinueWith((task, asyncState) =>
{ {
if (task.Status != TaskStatus.Faulted) if (task.Status != TaskStatus.Faulted)
@ -62,7 +62,7 @@ namespace Emby.Common.Implementations.Net
} }
}, state); }, state);
#else #else
_Socket.BeginReceiveFrom(state.Buffer, 0, state.Buffer.Length, System.Net.Sockets.SocketFlags.None, ref state.EndPoint, new AsyncCallback(this.ProcessResponse), state); _Socket.BeginReceiveFrom(state.Buffer, 0, state.Buffer.Length, SocketFlags.None, ref state.EndPoint, new AsyncCallback(this.ProcessResponse), state);
#endif #endif
return tcs.Task; return tcs.Task;
@ -84,7 +84,7 @@ namespace Emby.Common.Implementations.Net
buffer = copy; buffer = copy;
} }
_Socket.SendTo(buffer, new System.Net.IPEndPoint(IPAddress.Parse(endPoint.IpAddress.ToString()), endPoint.Port)); _Socket.SendTo(buffer, new IPEndPoint(IPAddress.Parse(endPoint.IpAddress.ToString()), endPoint.Port));
return Task.FromResult(true); return Task.FromResult(true);
#else #else
var taskSource = new TaskCompletionSource<bool>(); var taskSource = new TaskCompletionSource<bool>();
@ -153,7 +153,6 @@ namespace Emby.Common.Implementations.Net
#region Private Methods #region Private Methods
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1031:DoNotCatchGeneralExceptionTypes", Justification = "Exceptions via task methods should be reported by task completion source, so this should be ok.")]
private static void ProcessResponse(AsyncReceiveState state, Func<int> receiveData) private static void ProcessResponse(AsyncReceiveState state, Func<int> receiveData)
{ {
try try
@ -206,7 +205,6 @@ namespace Emby.Common.Implementations.Net
}; };
} }
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1031:DoNotCatchGeneralExceptionTypes", Justification = "Exceptions via task methods should be reported by task completion source, so this should be ok.")]
private void ProcessResponse(IAsyncResult asyncResult) private void ProcessResponse(IAsyncResult asyncResult)
{ {
#if NET46 #if NET46
@ -249,7 +247,7 @@ namespace Emby.Common.Implementations.Net
private class AsyncReceiveState private class AsyncReceiveState
{ {
public AsyncReceiveState(System.Net.Sockets.Socket socket, EndPoint endPoint) public AsyncReceiveState(Socket socket, EndPoint endPoint)
{ {
this.Socket = socket; this.Socket = socket;
this.EndPoint = endPoint; this.EndPoint = endPoint;
@ -258,7 +256,7 @@ namespace Emby.Common.Implementations.Net
public EndPoint EndPoint; public EndPoint EndPoint;
public byte[] Buffer = new byte[8192]; public byte[] Buffer = new byte[8192];
public System.Net.Sockets.Socket Socket { get; private set; } public Socket Socket { get; private set; }
public TaskCompletionSource<SocketReceiveResult> TaskCompletionSource { get; set; } public TaskCompletionSource<SocketReceiveResult> TaskCompletionSource { get; set; }

View File

@ -4,6 +4,7 @@ using System.Collections.Concurrent;
using System.Collections.Generic; using System.Collections.Generic;
using System.IO; using System.IO;
using System.Xml; using System.Xml;
using System.Xml.Serialization;
using MediaBrowser.Common.IO; using MediaBrowser.Common.IO;
using MediaBrowser.Model.IO; using MediaBrowser.Model.IO;
using MediaBrowser.Model.Logging; using MediaBrowser.Model.Logging;
@ -13,12 +14,12 @@ namespace Emby.Common.Implementations.Serialization
/// <summary> /// <summary>
/// Provides a wrapper around third party xml serialization. /// Provides a wrapper around third party xml serialization.
/// </summary> /// </summary>
public class XmlSerializer : IXmlSerializer public class MyXmlSerializer : IXmlSerializer
{ {
private readonly IFileSystem _fileSystem; private readonly IFileSystem _fileSystem;
private readonly ILogger _logger; private readonly ILogger _logger;
public XmlSerializer(IFileSystem fileSystem, ILogger logger) public MyXmlSerializer(IFileSystem fileSystem, ILogger logger)
{ {
_fileSystem = fileSystem; _fileSystem = fileSystem;
_logger = logger; _logger = logger;
@ -26,18 +27,18 @@ namespace Emby.Common.Implementations.Serialization
// Need to cache these // Need to cache these
// http://dotnetcodebox.blogspot.com/2013/01/xmlserializer-class-may-result-in.html // http://dotnetcodebox.blogspot.com/2013/01/xmlserializer-class-may-result-in.html
private readonly Dictionary<string, System.Xml.Serialization.XmlSerializer> _serializers = private readonly Dictionary<string, XmlSerializer> _serializers =
new Dictionary<string, System.Xml.Serialization.XmlSerializer>(); new Dictionary<string, XmlSerializer>();
private System.Xml.Serialization.XmlSerializer GetSerializer(Type type) private XmlSerializer GetSerializer(Type type)
{ {
var key = type.FullName; var key = type.FullName;
lock (_serializers) lock (_serializers)
{ {
System.Xml.Serialization.XmlSerializer serializer; XmlSerializer serializer;
if (!_serializers.TryGetValue(key, out serializer)) if (!_serializers.TryGetValue(key, out serializer))
{ {
serializer = new System.Xml.Serialization.XmlSerializer(type); serializer = new XmlSerializer(type);
_serializers[key] = serializer; _serializers[key] = serializer;
} }
return serializer; return serializer;
@ -80,7 +81,7 @@ namespace Emby.Common.Implementations.Serialization
#if NET46 #if NET46
using (var writer = new XmlTextWriter(stream, null)) using (var writer = new XmlTextWriter(stream, null))
{ {
writer.Formatting = System.Xml.Formatting.Indented; writer.Formatting = Formatting.Indented;
SerializeToWriter(obj, writer); SerializeToWriter(obj, writer);
} }
#else #else

View File

@ -12,15 +12,14 @@
"System.IO": "4.0.0.0", "System.IO": "4.0.0.0",
"System.Net": "4.0.0.0", "System.Net": "4.0.0.0",
"System.Net.Http": "4.0.0.0", "System.Net.Http": "4.0.0.0",
"System.Net.Http.WebRequest": "4.0.0.0",
"System.Net.Primitives": "4.0.0.0", "System.Net.Primitives": "4.0.0.0",
"System.Net.Http.WebRequest": "4.0.0.0",
"System.Runtime": "4.0.0.0", "System.Runtime": "4.0.0.0",
"System.Runtime.Extensions": "4.0.0.0", "System.Runtime.Extensions": "4.0.0.0",
"System.Text.Encoding": "4.0.0.0", "System.Text.Encoding": "4.0.0.0",
"System.Threading": "4.0.0.0", "System.Threading": "4.0.0.0",
"System.Threading.Tasks": "4.0.0.0", "System.Threading.Tasks": "4.0.0.0",
"System.Xml": "4.0.0.0", "System.Xml.ReaderWriter": "4.0.0"
"System.Xml.Serialization": "4.0.0.0"
}, },
"dependencies": { "dependencies": {
"SimpleInjector": "3.2.4", "SimpleInjector": "3.2.4",
@ -30,7 +29,8 @@
}, },
"MediaBrowser.Common": { "MediaBrowser.Common": {
"target": "project" "target": "project"
} } }
}
}, },
"netstandard1.6": { "netstandard1.6": {
"imports": "dnxcore50", "imports": "dnxcore50",
@ -40,6 +40,7 @@
"System.Diagnostics.Process": "4.1.0", "System.Diagnostics.Process": "4.1.0",
"System.Threading.Timer": "4.0.1", "System.Threading.Timer": "4.0.1",
"System.Net.Requests": "4.0.11", "System.Net.Requests": "4.0.11",
"System.Xml.ReaderWriter": "4.0.11",
"System.Xml.XmlSerializer": "4.0.11", "System.Xml.XmlSerializer": "4.0.11",
"System.Net.Http": "4.1.0", "System.Net.Http": "4.1.0",
"System.Net.Primitives": "4.0.11", "System.Net.Primitives": "4.0.11",

View File

@ -20,6 +20,7 @@ using MediaBrowser.Controller.MediaEncoding;
using MediaBrowser.Model.Dlna; using MediaBrowser.Model.Dlna;
using MediaBrowser.Model.Globalization; using MediaBrowser.Model.Globalization;
using MediaBrowser.Model.Net; using MediaBrowser.Model.Net;
using MediaBrowser.Model.System;
using MediaBrowser.Model.Threading; using MediaBrowser.Model.Threading;
using Rssdp; using Rssdp;
using Rssdp.Infrastructure; using Rssdp.Infrastructure;
@ -52,7 +53,7 @@ namespace Emby.Dlna.Main
private readonly ITimerFactory _timerFactory; private readonly ITimerFactory _timerFactory;
private readonly ISocketFactory _socketFactory; private readonly ISocketFactory _socketFactory;
private readonly IEnvironmentInfo _environmentInfo;
public DlnaEntryPoint(IServerConfigurationManager config, public DlnaEntryPoint(IServerConfigurationManager config,
ILogManager logManager, ILogManager logManager,
@ -66,7 +67,7 @@ namespace Emby.Dlna.Main
IUserDataManager userDataManager, IUserDataManager userDataManager,
ILocalizationManager localization, ILocalizationManager localization,
IMediaSourceManager mediaSourceManager, IMediaSourceManager mediaSourceManager,
IDeviceDiscovery deviceDiscovery, IMediaEncoder mediaEncoder, ISocketFactory socketFactory, ITimerFactory timerFactory) IDeviceDiscovery deviceDiscovery, IMediaEncoder mediaEncoder, ISocketFactory socketFactory, ITimerFactory timerFactory, IEnvironmentInfo environmentInfo)
{ {
_config = config; _config = config;
_appHost = appHost; _appHost = appHost;
@ -83,6 +84,7 @@ namespace Emby.Dlna.Main
_mediaEncoder = mediaEncoder; _mediaEncoder = mediaEncoder;
_socketFactory = socketFactory; _socketFactory = socketFactory;
_timerFactory = timerFactory; _timerFactory = timerFactory;
_environmentInfo = environmentInfo;
_logger = logManager.GetLogger("Dlna"); _logger = logManager.GetLogger("Dlna");
} }
@ -169,7 +171,7 @@ namespace Emby.Dlna.Main
private void StartPublishing() private void StartPublishing()
{ {
SsdpDevicePublisherBase.LogFunction = LogMessage; SsdpDevicePublisherBase.LogFunction = LogMessage;
_Publisher = new SsdpDevicePublisher(_socketFactory, _timerFactory, "Windows", "10"); _Publisher = new SsdpDevicePublisher(_socketFactory, _timerFactory, _environmentInfo.OperatingSystemName, _environmentInfo.OperatingSystemVersion);
} }
private void StartDeviceDiscovery() private void StartDeviceDiscovery()

View File

@ -13,6 +13,7 @@ using MediaBrowser.Controller.IO;
using MediaBrowser.Controller.Library; using MediaBrowser.Controller.Library;
using MediaBrowser.Model.Extensions; using MediaBrowser.Model.Extensions;
using MediaBrowser.Model.Logging; using MediaBrowser.Model.Logging;
using MediaBrowser.Model.System;
using MediaBrowser.Model.Tasks; using MediaBrowser.Model.Tasks;
using MediaBrowser.Model.Threading; using MediaBrowser.Model.Threading;
@ -32,8 +33,9 @@ namespace Emby.Server.Implementations.IO
public string Path { get; private set; } public string Path { get; private set; }
public event EventHandler<EventArgs> Completed; public event EventHandler<EventArgs> Completed;
private readonly IEnvironmentInfo _environmentInfo;
public FileRefresher(string path, IFileSystem fileSystem, IServerConfigurationManager configurationManager, ILibraryManager libraryManager, ITaskManager taskManager, ILogger logger, ITimerFactory timerFactory) public FileRefresher(string path, IFileSystem fileSystem, IServerConfigurationManager configurationManager, ILibraryManager libraryManager, ITaskManager taskManager, ILogger logger, ITimerFactory timerFactory, IEnvironmentInfo environmentInfo)
{ {
logger.Debug("New file refresher created for {0}", path); logger.Debug("New file refresher created for {0}", path);
Path = path; Path = path;
@ -44,6 +46,7 @@ namespace Emby.Server.Implementations.IO
TaskManager = taskManager; TaskManager = taskManager;
Logger = logger; Logger = logger;
_timerFactory = timerFactory; _timerFactory = timerFactory;
_environmentInfo = environmentInfo;
AddPath(path); AddPath(path);
} }
@ -226,11 +229,11 @@ namespace Emby.Server.Implementations.IO
private bool IsFileLocked(string path) private bool IsFileLocked(string path)
{ {
//if (Environment.OSVersion.Platform != PlatformID.Win32NT) if (_environmentInfo.OperatingSystem != OperatingSystem.Windows)
//{ {
// // Causing lockups on linux // Causing lockups on linux
// return false; return false;
//} }
try try
{ {

View File

@ -141,6 +141,7 @@
<Compile Include="Net\ISocketFactory.cs" /> <Compile Include="Net\ISocketFactory.cs" />
<Compile Include="Net\IUdpSocket.cs" /> <Compile Include="Net\IUdpSocket.cs" />
<Compile Include="Net\SocketReceiveResult.cs" /> <Compile Include="Net\SocketReceiveResult.cs" />
<Compile Include="System\IEnvironmentInfo.cs" />
<Compile Include="TextEncoding\IEncoding.cs" /> <Compile Include="TextEncoding\IEncoding.cs" />
<Compile Include="Extensions\LinqExtensions.cs" /> <Compile Include="Extensions\LinqExtensions.cs" />
<Compile Include="FileOrganization\SmartMatchInfo.cs" /> <Compile Include="FileOrganization\SmartMatchInfo.cs" />

View File

@ -0,0 +1,22 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace MediaBrowser.Model.System
{
public interface IEnvironmentInfo
{
MediaBrowser.Model.System.OperatingSystem OperatingSystem { get; }
string OperatingSystemName { get; }
string OperatingSystemVersion { get; }
}
public enum OperatingSystem
{
Windows,
Linux,
OSX
}
}

View File

@ -139,11 +139,12 @@ namespace MediaBrowser.Server.Implementations.IO
private readonly IFileSystem _fileSystem; private readonly IFileSystem _fileSystem;
private readonly ITimerFactory _timerFactory; private readonly ITimerFactory _timerFactory;
private readonly IEnvironmentInfo _environmentInfo;
/// <summary> /// <summary>
/// Initializes a new instance of the <see cref="LibraryMonitor" /> class. /// Initializes a new instance of the <see cref="LibraryMonitor" /> class.
/// </summary> /// </summary>
public LibraryMonitor(ILogManager logManager, ITaskManager taskManager, ILibraryManager libraryManager, IServerConfigurationManager configurationManager, IFileSystem fileSystem, ITimerFactory timerFactory, ISystemEvents systemEvents) public LibraryMonitor(ILogManager logManager, ITaskManager taskManager, ILibraryManager libraryManager, IServerConfigurationManager configurationManager, IFileSystem fileSystem, ITimerFactory timerFactory, ISystemEvents systemEvents, IEnvironmentInfo environmentInfo)
{ {
if (taskManager == null) if (taskManager == null)
{ {
@ -156,6 +157,7 @@ namespace MediaBrowser.Server.Implementations.IO
ConfigurationManager = configurationManager; ConfigurationManager = configurationManager;
_fileSystem = fileSystem; _fileSystem = fileSystem;
_timerFactory = timerFactory; _timerFactory = timerFactory;
_environmentInfo = environmentInfo;
systemEvents.Resume += _systemEvents_Resume; systemEvents.Resume += _systemEvents_Resume;
} }
@ -525,7 +527,7 @@ namespace MediaBrowser.Server.Implementations.IO
} }
} }
var newRefresher = new FileRefresher(path, _fileSystem, ConfigurationManager, LibraryManager, TaskManager, Logger, _timerFactory); var newRefresher = new FileRefresher(path, _fileSystem, ConfigurationManager, LibraryManager, TaskManager, Logger, _timerFactory, _environmentInfo);
newRefresher.Completed += NewRefresher_Completed; newRefresher.Completed += NewRefresher_Completed;
_activeRefreshers.Add(newRefresher); _activeRefreshers.Add(newRefresher);
} }

View File

@ -592,7 +592,7 @@ namespace MediaBrowser.Server.Startup.Common
var musicManager = new MusicManager(LibraryManager); var musicManager = new MusicManager(LibraryManager);
RegisterSingleInstance<IMusicManager>(new MusicManager(LibraryManager)); RegisterSingleInstance<IMusicManager>(new MusicManager(LibraryManager));
LibraryMonitor = new LibraryMonitor(LogManager, TaskManager, LibraryManager, ServerConfigurationManager, FileSystemManager, TimerFactory, SystemEvents); LibraryMonitor = new LibraryMonitor(LogManager, TaskManager, LibraryManager, ServerConfigurationManager, FileSystemManager, TimerFactory, SystemEvents, EnvironmentInfo);
RegisterSingleInstance(LibraryMonitor); RegisterSingleInstance(LibraryMonitor);
ProviderManager = new ProviderManager(HttpClient, ServerConfigurationManager, LibraryMonitor, LogManager, FileSystemManager, ApplicationPaths, () => LibraryManager, JsonSerializer, MemoryStreamProvider); ProviderManager = new ProviderManager(HttpClient, ServerConfigurationManager, LibraryMonitor, LogManager, FileSystemManager, ApplicationPaths, () => LibraryManager, JsonSerializer, MemoryStreamProvider);