浏览代码

fixes #800 - Server is drowsy

Luke Pulverenti 11 年之前
父节点
当前提交
06a11c27d9

+ 78 - 0
MediaBrowser.ServerApplication/EntryPoints/KeepServerAwake.cs

@@ -0,0 +1,78 @@
+using MediaBrowser.Controller.Plugins;
+using MediaBrowser.Controller.Session;
+using MediaBrowser.Model.Logging;
+using System;
+using System.Linq;
+using System.Runtime.InteropServices;
+using System.Threading;
+
+namespace MediaBrowser.ServerApplication.EntryPoints
+{
+    public class KeepServerAwake : IServerEntryPoint
+    {
+        private readonly ISessionManager _sessionManager;
+        private readonly ILogger _logger;
+        private Timer _timer;
+
+        public KeepServerAwake(ISessionManager sessionManager, ILogger logger)
+        {
+            _sessionManager = sessionManager;
+            _logger = logger;
+        }
+
+        public void Run()
+        {
+            _timer = new Timer(obj =>
+            {
+                var now = DateTime.UtcNow;
+                if (_sessionManager.Sessions.Any(i => (now - i.LastActivityDate).TotalMinutes < 5))
+                {
+                    KeepAlive();
+                }
+
+            }, null, TimeSpan.FromMinutes(5), TimeSpan.FromMinutes(5));
+        }
+
+        private void KeepAlive()
+        {
+            try
+            {
+                SystemHelper.ResetStandbyTimer();
+            }
+            catch (Exception ex)
+            {
+                _logger.ErrorException("Error resetting system standby timer", ex);
+            }
+        }
+
+        public void Dispose()
+        {
+            if (_timer != null)
+            {
+                _timer.Dispose();
+                _timer = null;
+            }
+        }
+    }
+
+    internal enum EXECUTION_STATE : uint
+    {
+        ES_NONE = 0,
+        ES_SYSTEM_REQUIRED = 0x00000001,
+        ES_DISPLAY_REQUIRED = 0x00000002,
+        ES_USER_PRESENT = 0x00000004,
+        ES_AWAYMODE_REQUIRED = 0x00000040,
+        ES_CONTINUOUS = 0x80000000
+    }
+
+    public class SystemHelper
+    {
+        [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
+        static extern EXECUTION_STATE SetThreadExecutionState(EXECUTION_STATE esFlags);
+
+        public static void ResetStandbyTimer()
+        {
+            EXECUTION_STATE es = SetThreadExecutionState(EXECUTION_STATE.ES_SYSTEM_REQUIRED);
+        }
+    }
+}

+ 1 - 0
MediaBrowser.ServerApplication/MediaBrowser.ServerApplication.csproj

@@ -96,6 +96,7 @@
     <Compile Include="BackgroundServiceInstaller.cs">
       <SubType>Component</SubType>
     </Compile>
+    <Compile Include="EntryPoints\KeepServerAwake.cs" />
     <Compile Include="EntryPoints\ResourceEntryPoint.cs" />
     <Compile Include="EntryPoints\StartupWizard.cs" />
     <Compile Include="EntryPoints\WanAddressEntryPoint.cs" />