diff --git a/MediaBrowser.Api/Playback/BaseStreamingService.cs b/MediaBrowser.Api/Playback/BaseStreamingService.cs
index bab0d1a6e4..a40e0f8c3f 100644
--- a/MediaBrowser.Api/Playback/BaseStreamingService.cs
+++ b/MediaBrowser.Api/Playback/BaseStreamingService.cs
@@ -1,4 +1,5 @@
using MediaBrowser.Controller.Devices;
+using MediaBrowser.Controller.Diagnostics;
using MediaBrowser.Model.Extensions;
using MediaBrowser.Common.Extensions;
using MediaBrowser.Common.IO;
@@ -70,12 +71,14 @@ namespace MediaBrowser.Api.Playback
protected IDeviceManager DeviceManager { get; private set; }
protected IChannelManager ChannelManager { get; private set; }
protected ISubtitleEncoder SubtitleEncoder { get; private set; }
+ protected IProcessManager ProcessManager { get; private set; }
///
/// Initializes a new instance of the class.
///
- protected BaseStreamingService(IServerConfigurationManager serverConfig, IUserManager userManager, ILibraryManager libraryManager, IIsoManager isoManager, IMediaEncoder mediaEncoder, IFileSystem fileSystem, ILiveTvManager liveTvManager, IDlnaManager dlnaManager, IChannelManager channelManager, ISubtitleEncoder subtitleEncoder, IDeviceManager deviceManager)
+ protected BaseStreamingService(IServerConfigurationManager serverConfig, IUserManager userManager, ILibraryManager libraryManager, IIsoManager isoManager, IMediaEncoder mediaEncoder, IFileSystem fileSystem, ILiveTvManager liveTvManager, IDlnaManager dlnaManager, IChannelManager channelManager, ISubtitleEncoder subtitleEncoder, IDeviceManager deviceManager, IProcessManager processManager)
{
+ ProcessManager = processManager;
DeviceManager = deviceManager;
SubtitleEncoder = subtitleEncoder;
ChannelManager = channelManager;
@@ -1093,9 +1096,26 @@ namespace MediaBrowser.Api.Playback
}
}
+ StartThrottler(state, transcodingJob);
+
return transcodingJob;
}
+ private void StartThrottler(StreamState state, TranscodingJob transcodingJob)
+ {
+ if (state.InputProtocol == MediaProtocol.File &&
+ state.RunTimeTicks.HasValue &&
+ state.VideoType == VideoType.VideoFile &&
+ !string.Equals(state.OutputVideoCodec, "copy", StringComparison.OrdinalIgnoreCase))
+ {
+ if (state.RunTimeTicks.Value >= TimeSpan.FromMinutes(5).Ticks && state.IsInputVideo)
+ {
+ state.TranscodingThrottler = new TranscodingThrottler(transcodingJob, Logger, ProcessManager);
+ state.TranscodingThrottler.Start();
+ }
+ }
+ }
+
private async void StartStreamingLog(TranscodingJob transcodingJob, StreamState state, Stream source, Stream target)
{
try
diff --git a/MediaBrowser.Api/Playback/Hls/BaseHlsService.cs b/MediaBrowser.Api/Playback/Hls/BaseHlsService.cs
index 2da5c33ce8..fdfa6e6d76 100644
--- a/MediaBrowser.Api/Playback/Hls/BaseHlsService.cs
+++ b/MediaBrowser.Api/Playback/Hls/BaseHlsService.cs
@@ -2,6 +2,7 @@
using MediaBrowser.Controller.Channels;
using MediaBrowser.Controller.Configuration;
using MediaBrowser.Controller.Devices;
+using MediaBrowser.Controller.Diagnostics;
using MediaBrowser.Controller.Dlna;
using MediaBrowser.Controller.Library;
using MediaBrowser.Controller.LiveTv;
@@ -23,7 +24,7 @@ namespace MediaBrowser.Api.Playback.Hls
///
public abstract class BaseHlsService : BaseStreamingService
{
- protected BaseHlsService(IServerConfigurationManager serverConfig, IUserManager userManager, ILibraryManager libraryManager, IIsoManager isoManager, IMediaEncoder mediaEncoder, IFileSystem fileSystem, ILiveTvManager liveTvManager, IDlnaManager dlnaManager, IChannelManager channelManager, ISubtitleEncoder subtitleEncoder, IDeviceManager deviceManager) : base(serverConfig, userManager, libraryManager, isoManager, mediaEncoder, fileSystem, liveTvManager, dlnaManager, channelManager, subtitleEncoder, deviceManager)
+ protected BaseHlsService(IServerConfigurationManager serverConfig, IUserManager userManager, ILibraryManager libraryManager, IIsoManager isoManager, IMediaEncoder mediaEncoder, IFileSystem fileSystem, ILiveTvManager liveTvManager, IDlnaManager dlnaManager, IChannelManager channelManager, ISubtitleEncoder subtitleEncoder, IDeviceManager deviceManager, IProcessManager processManager) : base(serverConfig, userManager, libraryManager, isoManager, mediaEncoder, fileSystem, liveTvManager, dlnaManager, channelManager, subtitleEncoder, deviceManager, processManager)
{
}
diff --git a/MediaBrowser.Api/Playback/Hls/DynamicHlsService.cs b/MediaBrowser.Api/Playback/Hls/DynamicHlsService.cs
index e639dbdfe3..1abaf52742 100644
--- a/MediaBrowser.Api/Playback/Hls/DynamicHlsService.cs
+++ b/MediaBrowser.Api/Playback/Hls/DynamicHlsService.cs
@@ -1,4 +1,5 @@
using MediaBrowser.Controller.Devices;
+using MediaBrowser.Controller.Diagnostics;
using MediaBrowser.Model.Extensions;
using MediaBrowser.Common.IO;
using MediaBrowser.Common.Net;
@@ -63,7 +64,7 @@ namespace MediaBrowser.Api.Playback.Hls
public class DynamicHlsService : BaseHlsService
{
- public DynamicHlsService(IServerConfigurationManager serverConfig, IUserManager userManager, ILibraryManager libraryManager, IIsoManager isoManager, IMediaEncoder mediaEncoder, IFileSystem fileSystem, ILiveTvManager liveTvManager, IDlnaManager dlnaManager, IChannelManager channelManager, ISubtitleEncoder subtitleEncoder, IDeviceManager deviceManager, INetworkManager networkManager) : base(serverConfig, userManager, libraryManager, isoManager, mediaEncoder, fileSystem, liveTvManager, dlnaManager, channelManager, subtitleEncoder, deviceManager)
+ public DynamicHlsService(IServerConfigurationManager serverConfig, IUserManager userManager, ILibraryManager libraryManager, IIsoManager isoManager, IMediaEncoder mediaEncoder, IFileSystem fileSystem, ILiveTvManager liveTvManager, IDlnaManager dlnaManager, IChannelManager channelManager, ISubtitleEncoder subtitleEncoder, IDeviceManager deviceManager, IProcessManager processManager, INetworkManager networkManager) : base(serverConfig, userManager, libraryManager, isoManager, mediaEncoder, fileSystem, liveTvManager, dlnaManager, channelManager, subtitleEncoder, deviceManager, processManager)
{
NetworkManager = networkManager;
}
diff --git a/MediaBrowser.Api/Playback/Hls/MpegDashService.cs b/MediaBrowser.Api/Playback/Hls/MpegDashService.cs
index 80451c0cc8..05909402c9 100644
--- a/MediaBrowser.Api/Playback/Hls/MpegDashService.cs
+++ b/MediaBrowser.Api/Playback/Hls/MpegDashService.cs
@@ -3,6 +3,7 @@ using MediaBrowser.Common.Net;
using MediaBrowser.Controller.Channels;
using MediaBrowser.Controller.Configuration;
using MediaBrowser.Controller.Devices;
+using MediaBrowser.Controller.Diagnostics;
using MediaBrowser.Controller.Dlna;
using MediaBrowser.Controller.Library;
using MediaBrowser.Controller.LiveTv;
@@ -51,7 +52,7 @@ namespace MediaBrowser.Api.Playback.Hls
public class MpegDashService : BaseHlsService
{
- public MpegDashService(IServerConfigurationManager serverConfig, IUserManager userManager, ILibraryManager libraryManager, IIsoManager isoManager, IMediaEncoder mediaEncoder, IFileSystem fileSystem, ILiveTvManager liveTvManager, IDlnaManager dlnaManager, IChannelManager channelManager, ISubtitleEncoder subtitleEncoder, IDeviceManager deviceManager, INetworkManager networkManager) : base(serverConfig, userManager, libraryManager, isoManager, mediaEncoder, fileSystem, liveTvManager, dlnaManager, channelManager, subtitleEncoder, deviceManager)
+ public MpegDashService(IServerConfigurationManager serverConfig, IUserManager userManager, ILibraryManager libraryManager, IIsoManager isoManager, IMediaEncoder mediaEncoder, IFileSystem fileSystem, ILiveTvManager liveTvManager, IDlnaManager dlnaManager, IChannelManager channelManager, ISubtitleEncoder subtitleEncoder, IDeviceManager deviceManager, IProcessManager processManager, INetworkManager networkManager) : base(serverConfig, userManager, libraryManager, isoManager, mediaEncoder, fileSystem, liveTvManager, dlnaManager, channelManager, subtitleEncoder, deviceManager, processManager)
{
NetworkManager = networkManager;
}
diff --git a/MediaBrowser.Api/Playback/Hls/VideoHlsService.cs b/MediaBrowser.Api/Playback/Hls/VideoHlsService.cs
index 8de52ea028..d27296bfdb 100644
--- a/MediaBrowser.Api/Playback/Hls/VideoHlsService.cs
+++ b/MediaBrowser.Api/Playback/Hls/VideoHlsService.cs
@@ -2,6 +2,7 @@ using MediaBrowser.Common.IO;
using MediaBrowser.Controller.Channels;
using MediaBrowser.Controller.Configuration;
using MediaBrowser.Controller.Devices;
+using MediaBrowser.Controller.Diagnostics;
using MediaBrowser.Controller.Dlna;
using MediaBrowser.Controller.Library;
using MediaBrowser.Controller.LiveTv;
@@ -57,7 +58,7 @@ namespace MediaBrowser.Api.Playback.Hls
///
public class VideoHlsService : BaseHlsService
{
- public VideoHlsService(IServerConfigurationManager serverConfig, IUserManager userManager, ILibraryManager libraryManager, IIsoManager isoManager, IMediaEncoder mediaEncoder, IFileSystem fileSystem, ILiveTvManager liveTvManager, IDlnaManager dlnaManager, IChannelManager channelManager, ISubtitleEncoder subtitleEncoder, IDeviceManager deviceManager) : base(serverConfig, userManager, libraryManager, isoManager, mediaEncoder, fileSystem, liveTvManager, dlnaManager, channelManager, subtitleEncoder, deviceManager)
+ public VideoHlsService(IServerConfigurationManager serverConfig, IUserManager userManager, ILibraryManager libraryManager, IIsoManager isoManager, IMediaEncoder mediaEncoder, IFileSystem fileSystem, ILiveTvManager liveTvManager, IDlnaManager dlnaManager, IChannelManager channelManager, ISubtitleEncoder subtitleEncoder, IDeviceManager deviceManager, IProcessManager processManager) : base(serverConfig, userManager, libraryManager, isoManager, mediaEncoder, fileSystem, liveTvManager, dlnaManager, channelManager, subtitleEncoder, deviceManager, processManager)
{
}
diff --git a/MediaBrowser.Api/Playback/Progressive/AudioService.cs b/MediaBrowser.Api/Playback/Progressive/AudioService.cs
index 37155b8f94..08ec13f4ff 100644
--- a/MediaBrowser.Api/Playback/Progressive/AudioService.cs
+++ b/MediaBrowser.Api/Playback/Progressive/AudioService.cs
@@ -3,6 +3,7 @@ using MediaBrowser.Common.Net;
using MediaBrowser.Controller.Channels;
using MediaBrowser.Controller.Configuration;
using MediaBrowser.Controller.Devices;
+using MediaBrowser.Controller.Diagnostics;
using MediaBrowser.Controller.Dlna;
using MediaBrowser.Controller.Drawing;
using MediaBrowser.Controller.Library;
@@ -32,7 +33,7 @@ namespace MediaBrowser.Api.Playback.Progressive
///
public class AudioService : BaseProgressiveStreamingService
{
- public AudioService(IServerConfigurationManager serverConfig, IUserManager userManager, ILibraryManager libraryManager, IIsoManager isoManager, IMediaEncoder mediaEncoder, IFileSystem fileSystem, ILiveTvManager liveTvManager, IDlnaManager dlnaManager, IChannelManager channelManager, ISubtitleEncoder subtitleEncoder, IDeviceManager deviceManager, IImageProcessor imageProcessor, IHttpClient httpClient) : base(serverConfig, userManager, libraryManager, isoManager, mediaEncoder, fileSystem, liveTvManager, dlnaManager, channelManager, subtitleEncoder, deviceManager, imageProcessor, httpClient)
+ public AudioService(IServerConfigurationManager serverConfig, IUserManager userManager, ILibraryManager libraryManager, IIsoManager isoManager, IMediaEncoder mediaEncoder, IFileSystem fileSystem, ILiveTvManager liveTvManager, IDlnaManager dlnaManager, IChannelManager channelManager, ISubtitleEncoder subtitleEncoder, IDeviceManager deviceManager, IProcessManager processManager, IImageProcessor imageProcessor, IHttpClient httpClient) : base(serverConfig, userManager, libraryManager, isoManager, mediaEncoder, fileSystem, liveTvManager, dlnaManager, channelManager, subtitleEncoder, deviceManager, processManager, imageProcessor, httpClient)
{
}
diff --git a/MediaBrowser.Api/Playback/Progressive/BaseProgressiveStreamingService.cs b/MediaBrowser.Api/Playback/Progressive/BaseProgressiveStreamingService.cs
index bc1c86eeee..0af4587b67 100644
--- a/MediaBrowser.Api/Playback/Progressive/BaseProgressiveStreamingService.cs
+++ b/MediaBrowser.Api/Playback/Progressive/BaseProgressiveStreamingService.cs
@@ -3,6 +3,7 @@ using MediaBrowser.Common.Net;
using MediaBrowser.Controller.Channels;
using MediaBrowser.Controller.Configuration;
using MediaBrowser.Controller.Devices;
+using MediaBrowser.Controller.Diagnostics;
using MediaBrowser.Controller.Dlna;
using MediaBrowser.Controller.Drawing;
using MediaBrowser.Controller.Library;
@@ -29,7 +30,7 @@ namespace MediaBrowser.Api.Playback.Progressive
protected readonly IImageProcessor ImageProcessor;
protected readonly IHttpClient HttpClient;
- protected BaseProgressiveStreamingService(IServerConfigurationManager serverConfig, IUserManager userManager, ILibraryManager libraryManager, IIsoManager isoManager, IMediaEncoder mediaEncoder, IFileSystem fileSystem, ILiveTvManager liveTvManager, IDlnaManager dlnaManager, IChannelManager channelManager, ISubtitleEncoder subtitleEncoder, IDeviceManager deviceManager, IImageProcessor imageProcessor, IHttpClient httpClient) : base(serverConfig, userManager, libraryManager, isoManager, mediaEncoder, fileSystem, liveTvManager, dlnaManager, channelManager, subtitleEncoder, deviceManager)
+ protected BaseProgressiveStreamingService(IServerConfigurationManager serverConfig, IUserManager userManager, ILibraryManager libraryManager, IIsoManager isoManager, IMediaEncoder mediaEncoder, IFileSystem fileSystem, ILiveTvManager liveTvManager, IDlnaManager dlnaManager, IChannelManager channelManager, ISubtitleEncoder subtitleEncoder, IDeviceManager deviceManager, IProcessManager processManager, IImageProcessor imageProcessor, IHttpClient httpClient) : base(serverConfig, userManager, libraryManager, isoManager, mediaEncoder, fileSystem, liveTvManager, dlnaManager, channelManager, subtitleEncoder, deviceManager, processManager)
{
ImageProcessor = imageProcessor;
HttpClient = httpClient;
diff --git a/MediaBrowser.Api/Playback/Progressive/VideoService.cs b/MediaBrowser.Api/Playback/Progressive/VideoService.cs
index 7e86b867f6..9b161085a9 100644
--- a/MediaBrowser.Api/Playback/Progressive/VideoService.cs
+++ b/MediaBrowser.Api/Playback/Progressive/VideoService.cs
@@ -3,6 +3,7 @@ using MediaBrowser.Common.Net;
using MediaBrowser.Controller.Channels;
using MediaBrowser.Controller.Configuration;
using MediaBrowser.Controller.Devices;
+using MediaBrowser.Controller.Diagnostics;
using MediaBrowser.Controller.Dlna;
using MediaBrowser.Controller.Drawing;
using MediaBrowser.Controller.Library;
@@ -63,7 +64,7 @@ namespace MediaBrowser.Api.Playback.Progressive
///
public class VideoService : BaseProgressiveStreamingService
{
- public VideoService(IServerConfigurationManager serverConfig, IUserManager userManager, ILibraryManager libraryManager, IIsoManager isoManager, IMediaEncoder mediaEncoder, IFileSystem fileSystem, ILiveTvManager liveTvManager, IDlnaManager dlnaManager, IChannelManager channelManager, ISubtitleEncoder subtitleEncoder, IDeviceManager deviceManager, IImageProcessor imageProcessor, IHttpClient httpClient) : base(serverConfig, userManager, libraryManager, isoManager, mediaEncoder, fileSystem, liveTvManager, dlnaManager, channelManager, subtitleEncoder, deviceManager, imageProcessor, httpClient)
+ public VideoService(IServerConfigurationManager serverConfig, IUserManager userManager, ILibraryManager libraryManager, IIsoManager isoManager, IMediaEncoder mediaEncoder, IFileSystem fileSystem, ILiveTvManager liveTvManager, IDlnaManager dlnaManager, IChannelManager channelManager, ISubtitleEncoder subtitleEncoder, IDeviceManager deviceManager, IProcessManager processManager, IImageProcessor imageProcessor, IHttpClient httpClient) : base(serverConfig, userManager, libraryManager, isoManager, mediaEncoder, fileSystem, liveTvManager, dlnaManager, channelManager, subtitleEncoder, deviceManager, processManager, imageProcessor, httpClient)
{
}
diff --git a/MediaBrowser.Api/Playback/StreamState.cs b/MediaBrowser.Api/Playback/StreamState.cs
index 40e765f1ae..588d3b75cc 100644
--- a/MediaBrowser.Api/Playback/StreamState.cs
+++ b/MediaBrowser.Api/Playback/StreamState.cs
@@ -1,17 +1,16 @@
-using MediaBrowser.Common.Net;
-using MediaBrowser.Controller.LiveTv;
+using MediaBrowser.Controller.LiveTv;
using MediaBrowser.Model.Dlna;
using MediaBrowser.Model.Drawing;
using MediaBrowser.Model.Entities;
using MediaBrowser.Model.IO;
using MediaBrowser.Model.Logging;
using MediaBrowser.Model.MediaInfo;
+using MediaBrowser.Model.Net;
using System;
using System.Collections.Generic;
using System.Globalization;
using System.IO;
using System.Threading;
-using MediaBrowser.Model.Net;
namespace MediaBrowser.Api.Playback
{
@@ -23,6 +22,7 @@ namespace MediaBrowser.Api.Playback
public string RequestedUrl { get; set; }
public StreamRequest Request { get; set; }
+ public TranscodingThrottler TranscodingThrottler { get; set; }
public VideoStreamRequest VideoRequest
{
@@ -125,6 +125,7 @@ namespace MediaBrowser.Api.Playback
public void Dispose()
{
+ DisposeTranscodingThrottler();
DisposeLiveStream();
DisposeLogStream();
DisposeIsoMount();
@@ -147,6 +148,23 @@ namespace MediaBrowser.Api.Playback
}
}
+ private void DisposeTranscodingThrottler()
+ {
+ if (TranscodingThrottler != null)
+ {
+ try
+ {
+ TranscodingThrottler.Dispose();
+ }
+ catch (Exception ex)
+ {
+ _logger.ErrorException("Error disposing TranscodingThrottler", ex);
+ }
+
+ TranscodingThrottler = null;
+ }
+ }
+
private void DisposeIsoMount()
{
if (IsoMount != null)
diff --git a/MediaBrowser.Api/Playback/TranscodingThrottler.cs b/MediaBrowser.Api/Playback/TranscodingThrottler.cs
index 50c213655b..432f4667da 100644
--- a/MediaBrowser.Api/Playback/TranscodingThrottler.cs
+++ b/MediaBrowser.Api/Playback/TranscodingThrottler.cs
@@ -1,4 +1,5 @@
-using MediaBrowser.Model.Logging;
+using MediaBrowser.Controller.Diagnostics;
+using MediaBrowser.Model.Logging;
using System;
using System.IO;
using System.Threading;
@@ -9,11 +10,16 @@ namespace MediaBrowser.Api.Playback
{
private readonly TranscodingJob _job;
private readonly ILogger _logger;
+ private readonly IProcessManager _processManager;
private Timer _timer;
+ private bool _isPaused;
public void Start()
{
- _timer = new Timer(TimerCallback, null, 5000, 5000);
+ if (_processManager.SupportsSuspension)
+ {
+ _timer = new Timer(TimerCallback, null, 5000, 5000);
+ }
}
private void TimerCallback(object state)
@@ -36,22 +42,49 @@ namespace MediaBrowser.Api.Playback
private void PauseTranscoding()
{
- _logger.Debug("Sending pause command to ffmpeg");
- _job.Process.StandardInput.WriteLine("p");
+ if (!_isPaused)
+ {
+ _logger.Debug("Sending pause command to ffmpeg");
+ }
+
+ try
+ {
+ //_job.Process.StandardInput.WriteLine("p");
+ _processManager.SuspendProcess(_job.Process);
+ _isPaused = true;
+ }
+ catch (Exception ex)
+ {
+ _logger.ErrorException("Error pausing transcoding", ex);
+ }
}
private void UnpauseTranscoding()
{
- _logger.Debug("Sending unpause command to ffmpeg");
- _job.Process.StandardInput.WriteLine("u");
+ if (_isPaused)
+ {
+ _logger.Debug("Sending unpause command to ffmpeg");
+ }
+
+ try
+ {
+ //_job.Process.StandardInput.WriteLine("u");
+ _processManager.ResumeProcess(_job.Process);
+ _isPaused = false;
+ }
+ catch (Exception ex)
+ {
+ _logger.ErrorException("Error unpausing transcoding", ex);
+ }
}
private readonly long _gapLengthInTicks = TimeSpan.FromMinutes(2).Ticks;
- public TranscodingThrottler(TranscodingJob job, ILogger logger)
+ public TranscodingThrottler(TranscodingJob job, ILogger logger, IProcessManager processManager)
{
_job = job;
_logger = logger;
+ _processManager = processManager;
}
private bool IsThrottleAllowed(TranscodingJob job)
@@ -106,13 +139,11 @@ namespace MediaBrowser.Api.Playback
catch
{
//_logger.Error("Error getting output size");
+ return false;
}
}
- else
- {
- //_logger.Debug("No throttle data for " + path);
- }
+ //_logger.Debug("No throttle data for " + path);
return false;
}
diff --git a/MediaBrowser.Controller/Diagnostics/IProcessManager.cs b/MediaBrowser.Controller/Diagnostics/IProcessManager.cs
new file mode 100644
index 0000000000..2e076bd882
--- /dev/null
+++ b/MediaBrowser.Controller/Diagnostics/IProcessManager.cs
@@ -0,0 +1,28 @@
+using System.Diagnostics;
+
+namespace MediaBrowser.Controller.Diagnostics
+{
+ ///
+ /// Interface IProcessManager
+ ///
+ public interface IProcessManager
+ {
+ ///
+ /// Gets a value indicating whether [supports suspension].
+ ///
+ /// true if [supports suspension]; otherwise, false.
+ bool SupportsSuspension { get; }
+
+ ///
+ /// Suspends the process.
+ ///
+ /// The process.
+ void SuspendProcess(Process process);
+
+ ///
+ /// Resumes the process.
+ ///
+ /// The process.
+ void ResumeProcess(Process process);
+ }
+}
diff --git a/MediaBrowser.Controller/MediaBrowser.Controller.csproj b/MediaBrowser.Controller/MediaBrowser.Controller.csproj
index 603cb02e0d..36809c5d38 100644
--- a/MediaBrowser.Controller/MediaBrowser.Controller.csproj
+++ b/MediaBrowser.Controller/MediaBrowser.Controller.csproj
@@ -104,6 +104,7 @@
+
diff --git a/MediaBrowser.Server.Implementations/Library/UserManager.cs b/MediaBrowser.Server.Implementations/Library/UserManager.cs
index 0f160bc2ec..846bad214e 100644
--- a/MediaBrowser.Server.Implementations/Library/UserManager.cs
+++ b/MediaBrowser.Server.Implementations/Library/UserManager.cs
@@ -277,7 +277,11 @@ namespace MediaBrowser.Server.Implementations.Library
{
user.Policy.InvalidLoginAttemptCount = newValue;
- if (newValue >= 3)
+ var maxCount = user.Policy.IsAdministrator ?
+ 3 :
+ 5;
+
+ if (newValue >= maxCount)
{
_logger.Debug("Disabling user {0} due to {1} unsuccessful login attempts.", user.Name, newValue.ToString(CultureInfo.InvariantCulture));
user.Policy.IsDisabled = true;
diff --git a/MediaBrowser.Server.Implementations/Sync/FolderSync/FolderSyncProvider.cs b/MediaBrowser.Server.Implementations/Sync/FolderSync/FolderSyncProvider.cs
index 9cf2341064..3183816c8a 100644
--- a/MediaBrowser.Server.Implementations/Sync/FolderSync/FolderSyncProvider.cs
+++ b/MediaBrowser.Server.Implementations/Sync/FolderSync/FolderSyncProvider.cs
@@ -113,6 +113,7 @@ namespace MediaBrowser.Server.Implementations.Sync.FolderSync
private IEnumerable GetSyncAccounts()
{
+ return new List();
// Dummy this up
return _userManager
.Users
diff --git a/MediaBrowser.Server.Mono/Diagnostics/LinuxProcessManager.cs b/MediaBrowser.Server.Mono/Diagnostics/LinuxProcessManager.cs
new file mode 100644
index 0000000000..a66365212b
--- /dev/null
+++ b/MediaBrowser.Server.Mono/Diagnostics/LinuxProcessManager.cs
@@ -0,0 +1,25 @@
+using MediaBrowser.Controller.Diagnostics;
+using System.Diagnostics;
+
+namespace MediaBrowser.Server.Mono.Diagnostics
+{
+ public class LinuxProcessManager : IProcessManager
+ {
+ public bool SupportsSuspension
+ {
+ get { return true; }
+ }
+
+ public void SuspendProcess(Process process)
+ {
+ // http://jumptuck.com/2011/11/23/quick-tip-pause-process-linux/
+ process.StandardInput.WriteLine("^Z");
+ }
+
+ public void ResumeProcess(Process process)
+ {
+ // http://jumptuck.com/2011/11/23/quick-tip-pause-process-linux/
+ process.StandardInput.WriteLine("fg");
+ }
+ }
+}
diff --git a/MediaBrowser.Server.Mono/Diagnostics/ProcessManager.cs b/MediaBrowser.Server.Mono/Diagnostics/ProcessManager.cs
new file mode 100644
index 0000000000..05d1a4151a
--- /dev/null
+++ b/MediaBrowser.Server.Mono/Diagnostics/ProcessManager.cs
@@ -0,0 +1,24 @@
+using MediaBrowser.Controller.Diagnostics;
+using System;
+using System.Diagnostics;
+
+namespace MediaBrowser.Server.Mono.Diagnostics
+{
+ public class ProcessManager : IProcessManager
+ {
+ public void SuspendProcess(Process process)
+ {
+ throw new NotImplementedException();
+ }
+
+ public void ResumeProcess(Process process)
+ {
+ throw new NotImplementedException();
+ }
+
+ public bool SupportsSuspension
+ {
+ get { return false; }
+ }
+ }
+}
diff --git a/MediaBrowser.Server.Mono/MediaBrowser.Server.Mono.csproj b/MediaBrowser.Server.Mono/MediaBrowser.Server.Mono.csproj
index cd010e1c13..8b4783b5c0 100644
--- a/MediaBrowser.Server.Mono/MediaBrowser.Server.Mono.csproj
+++ b/MediaBrowser.Server.Mono/MediaBrowser.Server.Mono.csproj
@@ -74,6 +74,8 @@
Properties\SharedVersion.cs
+
+
diff --git a/MediaBrowser.Server.Mono/Native/BaseMonoApp.cs b/MediaBrowser.Server.Mono/Native/BaseMonoApp.cs
index 1ec0109ad8..139661aa28 100644
--- a/MediaBrowser.Server.Mono/Native/BaseMonoApp.cs
+++ b/MediaBrowser.Server.Mono/Native/BaseMonoApp.cs
@@ -1,6 +1,8 @@
using MediaBrowser.Common.Net;
+using MediaBrowser.Controller.Diagnostics;
using MediaBrowser.IsoMounter;
using MediaBrowser.Model.Logging;
+using MediaBrowser.Server.Mono.Diagnostics;
using MediaBrowser.Server.Mono.Networking;
using MediaBrowser.Server.Startup.Common;
using Mono.Unix.Native;
@@ -189,5 +191,16 @@ namespace MediaBrowser.Server.Mono.Native
public string sysname = string.Empty;
public string machine = string.Empty;
}
+
+
+ public IProcessManager GetProcessManager()
+ {
+ if (Environment.OperatingSystem == Startup.Common.OperatingSystem.Linux)
+ {
+ return new LinuxProcessManager();
+ }
+
+ return new ProcessManager();
+ }
}
}
diff --git a/MediaBrowser.Server.Startup.Common/ApplicationHost.cs b/MediaBrowser.Server.Startup.Common/ApplicationHost.cs
index fac704b687..63d30a6069 100644
--- a/MediaBrowser.Server.Startup.Common/ApplicationHost.cs
+++ b/MediaBrowser.Server.Startup.Common/ApplicationHost.cs
@@ -380,6 +380,8 @@ namespace MediaBrowser.Server.Startup.Common
RegisterSingleInstance(ServerConfigurationManager);
+ RegisterSingleInstance(NativeApp.GetProcessManager());
+
LocalizationManager = new LocalizationManager(ServerConfigurationManager, FileSystemManager, JsonSerializer);
RegisterSingleInstance(LocalizationManager);
diff --git a/MediaBrowser.Server.Startup.Common/INativeApp.cs b/MediaBrowser.Server.Startup.Common/INativeApp.cs
index 2dbd844baa..1c4b5b1d58 100644
--- a/MediaBrowser.Server.Startup.Common/INativeApp.cs
+++ b/MediaBrowser.Server.Startup.Common/INativeApp.cs
@@ -1,4 +1,5 @@
using MediaBrowser.Common.Net;
+using MediaBrowser.Controller.Diagnostics;
using MediaBrowser.Model.Logging;
using System.Collections.Generic;
using System.Reflection;
@@ -84,5 +85,11 @@ namespace MediaBrowser.Server.Startup.Common
/// Prevents the system stand by.
///
void PreventSystemStandby();
+
+ ///
+ /// Gets the process manager.
+ ///
+ /// IProcessManager.
+ IProcessManager GetProcessManager();
}
}
diff --git a/MediaBrowser.ServerApplication/MediaBrowser.ServerApplication.csproj b/MediaBrowser.ServerApplication/MediaBrowser.ServerApplication.csproj
index 984cca44b7..fcda32a330 100644
--- a/MediaBrowser.ServerApplication/MediaBrowser.ServerApplication.csproj
+++ b/MediaBrowser.ServerApplication/MediaBrowser.ServerApplication.csproj
@@ -113,6 +113,7 @@
+
diff --git a/MediaBrowser.ServerApplication/Native/WindowsApp.cs b/MediaBrowser.ServerApplication/Native/WindowsApp.cs
index 476fb58b9d..8d25b4f722 100644
--- a/MediaBrowser.ServerApplication/Native/WindowsApp.cs
+++ b/MediaBrowser.ServerApplication/Native/WindowsApp.cs
@@ -1,5 +1,6 @@
using MediaBrowser.Common.IO;
using MediaBrowser.Common.Net;
+using MediaBrowser.Controller.Diagnostics;
using MediaBrowser.IsoMounter;
using MediaBrowser.Model.Logging;
using MediaBrowser.Server.Startup.Common;
@@ -109,5 +110,10 @@ namespace MediaBrowser.ServerApplication.Native
{
Standby.PreventSystemStandby();
}
+
+ public IProcessManager GetProcessManager()
+ {
+ return new WindowsProcessManager();
+ }
}
}
diff --git a/MediaBrowser.ServerApplication/Native/WindowsProcessManager.cs b/MediaBrowser.ServerApplication/Native/WindowsProcessManager.cs
new file mode 100644
index 0000000000..f3497aef55
--- /dev/null
+++ b/MediaBrowser.ServerApplication/Native/WindowsProcessManager.cs
@@ -0,0 +1,78 @@
+using MediaBrowser.Controller.Diagnostics;
+using System;
+using System.Diagnostics;
+using System.Runtime.InteropServices;
+
+namespace MediaBrowser.ServerApplication.Native
+{
+ public class WindowsProcessManager : IProcessManager
+ {
+ public void SuspendProcess(Process process)
+ {
+ process.Suspend();
+ }
+
+ public void ResumeProcess(Process process)
+ {
+ process.Resume();
+ }
+
+ public bool SupportsSuspension
+ {
+ get { return true; }
+ }
+ }
+
+ public static class ProcessExtension
+ {
+ [DllImport("kernel32.dll")]
+ static extern IntPtr OpenThread(ThreadAccess dwDesiredAccess, bool bInheritHandle, uint dwThreadId);
+ [DllImport("kernel32.dll")]
+ static extern uint SuspendThread(IntPtr hThread);
+ [DllImport("kernel32.dll")]
+ static extern int ResumeThread(IntPtr hThread);
+
+ public static void Suspend(this Process process)
+ {
+ foreach (ProcessThread thread in process.Threads)
+ {
+ var pOpenThread = OpenThread(ThreadAccess.SUSPEND_RESUME, false, (uint)thread.Id);
+ if (pOpenThread == IntPtr.Zero)
+ {
+ break;
+ }
+ SuspendThread(pOpenThread);
+ }
+ }
+ public static void Resume(this Process process)
+ {
+ foreach (ProcessThread thread in process.Threads)
+ {
+ var pOpenThread = OpenThread(ThreadAccess.SUSPEND_RESUME, false, (uint)thread.Id);
+ if (pOpenThread == IntPtr.Zero)
+ {
+ break;
+ }
+ ResumeThread(pOpenThread);
+ }
+ }
+ public static void Print(this Process process)
+ {
+ Console.WriteLine("{0,8} {1}", process.Id, process.ProcessName);
+ }
+ }
+
+ [Flags]
+ public enum ThreadAccess : int
+ {
+ TERMINATE = (0x0001),
+ SUSPEND_RESUME = (0x0002),
+ GET_CONTEXT = (0x0008),
+ SET_CONTEXT = (0x0010),
+ SET_INFORMATION = (0x0020),
+ QUERY_INFORMATION = (0x0040),
+ SET_THREAD_TOKEN = (0x0080),
+ IMPERSONATE = (0x0100),
+ DIRECT_IMPERSONATION = (0x0200)
+ }
+}