mirror of
				https://github.com/jellyfin/jellyfin.git
				synced 2025-11-03 19:17:24 -05:00 
			
		
		
		
	update image & subtitle extraction
This commit is contained in:
		
							parent
							
								
									ceaf0e2098
								
							
						
					
					
						commit
						9b5a4c22e3
					
				@ -59,6 +59,7 @@
 | 
				
			|||||||
    <Compile Include="EntryPoints\RecordingNotifier.cs" />
 | 
					    <Compile Include="EntryPoints\RecordingNotifier.cs" />
 | 
				
			||||||
    <Compile Include="EntryPoints\RefreshUsersMetadata.cs" />
 | 
					    <Compile Include="EntryPoints\RefreshUsersMetadata.cs" />
 | 
				
			||||||
    <Compile Include="EntryPoints\ServerEventNotifier.cs" />
 | 
					    <Compile Include="EntryPoints\ServerEventNotifier.cs" />
 | 
				
			||||||
 | 
					    <Compile Include="EntryPoints\SystemEvents.cs" />
 | 
				
			||||||
    <Compile Include="EntryPoints\UdpServerEntryPoint.cs" />
 | 
					    <Compile Include="EntryPoints\UdpServerEntryPoint.cs" />
 | 
				
			||||||
    <Compile Include="EntryPoints\UsageEntryPoint.cs" />
 | 
					    <Compile Include="EntryPoints\UsageEntryPoint.cs" />
 | 
				
			||||||
    <Compile Include="EntryPoints\UsageReporter.cs" />
 | 
					    <Compile Include="EntryPoints\UsageReporter.cs" />
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										47
									
								
								Emby.Server.Implementations/EntryPoints/SystemEvents.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										47
									
								
								Emby.Server.Implementations/EntryPoints/SystemEvents.cs
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,47 @@
 | 
				
			|||||||
 | 
					using System;
 | 
				
			||||||
 | 
					using System.Collections.Generic;
 | 
				
			||||||
 | 
					using System.Linq;
 | 
				
			||||||
 | 
					using System.Text;
 | 
				
			||||||
 | 
					using System.Threading.Tasks;
 | 
				
			||||||
 | 
					using MediaBrowser.Model.System;
 | 
				
			||||||
 | 
					using MediaBrowser.Controller.Plugins;
 | 
				
			||||||
 | 
					using MediaBrowser.Common;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					namespace Emby.Server.Implementations.EntryPoints
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    public class SystemEvents : IServerEntryPoint
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        private readonly ISystemEvents _systemEvents;
 | 
				
			||||||
 | 
					        private readonly IApplicationHost _appHost;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        public SystemEvents(ISystemEvents systemEvents, IApplicationHost appHost)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            _systemEvents = systemEvents;
 | 
				
			||||||
 | 
					            _appHost = appHost;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        public void Run()
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            _systemEvents.SessionLogoff += _systemEvents_SessionLogoff;
 | 
				
			||||||
 | 
					            _systemEvents.SystemShutdown += _systemEvents_SystemShutdown;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        private void _systemEvents_SessionLogoff(object sender, EventArgs e)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            if (!_appHost.IsRunningAsService)
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                _appHost.Shutdown();
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        private void _systemEvents_SystemShutdown(object sender, EventArgs e)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            _appHost.Shutdown();
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        public void Dispose()
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            _systemEvents.SystemShutdown -= _systemEvents_SystemShutdown;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@ -542,8 +542,6 @@ namespace MediaBrowser.MediaEncoding.Encoder
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
                // Must consume both or ffmpeg may hang due to deadlocks. See comments below.   
 | 
					                // Must consume both or ffmpeg may hang due to deadlocks. See comments below.   
 | 
				
			||||||
                RedirectStandardOutput = true,
 | 
					                RedirectStandardOutput = true,
 | 
				
			||||||
                //RedirectStandardError = true,
 | 
					 | 
				
			||||||
                RedirectStandardInput = false,
 | 
					 | 
				
			||||||
                FileName = FFProbePath,
 | 
					                FileName = FFProbePath,
 | 
				
			||||||
                Arguments = string.Format(args, probeSizeArgument, inputPath).Trim(),
 | 
					                Arguments = string.Format(args, probeSizeArgument, inputPath).Trim(),
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -554,7 +552,7 @@ namespace MediaBrowser.MediaEncoding.Encoder
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
            _logger.Debug("{0} {1}", process.StartInfo.FileName, process.StartInfo.Arguments);
 | 
					            _logger.Debug("{0} {1}", process.StartInfo.FileName, process.StartInfo.Arguments);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            using (var processWrapper = new ProcessWrapper(process, this, _logger, false))
 | 
					            using (var processWrapper = new ProcessWrapper(process, this, _logger))
 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
                await _ffProbeResourcePool.WaitAsync(cancellationToken).ConfigureAwait(false);
 | 
					                await _ffProbeResourcePool.WaitAsync(cancellationToken).ConfigureAwait(false);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -616,7 +614,7 @@ namespace MediaBrowser.MediaEncoding.Encoder
 | 
				
			|||||||
                }
 | 
					                }
 | 
				
			||||||
                catch
 | 
					                catch
 | 
				
			||||||
                {
 | 
					                {
 | 
				
			||||||
                    StopProcess(processWrapper, 100, true);
 | 
					                    StopProcess(processWrapper, 100);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                    throw;
 | 
					                    throw;
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
@ -671,9 +669,7 @@ namespace MediaBrowser.MediaEncoding.Encoder
 | 
				
			|||||||
                UseShellExecute = false,
 | 
					                UseShellExecute = false,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                // Must consume both or ffmpeg may hang due to deadlocks. See comments below.   
 | 
					                // Must consume both or ffmpeg may hang due to deadlocks. See comments below.   
 | 
				
			||||||
                //RedirectStandardOutput = true,
 | 
					 | 
				
			||||||
                RedirectStandardError = true,
 | 
					                RedirectStandardError = true,
 | 
				
			||||||
                RedirectStandardInput = false,
 | 
					 | 
				
			||||||
                FileName = FFMpegPath,
 | 
					                FileName = FFMpegPath,
 | 
				
			||||||
                Arguments = string.Format(args, probeSizeArgument, inputPath, videoStream.Index.ToString(CultureInfo.InvariantCulture)).Trim(),
 | 
					                Arguments = string.Format(args, probeSizeArgument, inputPath, videoStream.Index.ToString(CultureInfo.InvariantCulture)).Trim(),
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -685,7 +681,7 @@ namespace MediaBrowser.MediaEncoding.Encoder
 | 
				
			|||||||
            _logger.Debug("{0} {1}", process.StartInfo.FileName, process.StartInfo.Arguments);
 | 
					            _logger.Debug("{0} {1}", process.StartInfo.FileName, process.StartInfo.Arguments);
 | 
				
			||||||
            var idetFoundInterlaced = false;
 | 
					            var idetFoundInterlaced = false;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            using (var processWrapper = new ProcessWrapper(process, this, _logger, false))
 | 
					            using (var processWrapper = new ProcessWrapper(process, this, _logger))
 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
                try
 | 
					                try
 | 
				
			||||||
                {
 | 
					                {
 | 
				
			||||||
@ -728,7 +724,7 @@ namespace MediaBrowser.MediaEncoding.Encoder
 | 
				
			|||||||
                }
 | 
					                }
 | 
				
			||||||
                catch
 | 
					                catch
 | 
				
			||||||
                {
 | 
					                {
 | 
				
			||||||
                    StopProcess(processWrapper, 100, true);
 | 
					                    StopProcess(processWrapper, 100);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                    throw;
 | 
					                    throw;
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
@ -945,7 +941,7 @@ namespace MediaBrowser.MediaEncoding.Encoder
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
            _logger.Debug("{0} {1}", process.StartInfo.FileName, process.StartInfo.Arguments);
 | 
					            _logger.Debug("{0} {1}", process.StartInfo.FileName, process.StartInfo.Arguments);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            using (var processWrapper = new ProcessWrapper(process, this, _logger, false))
 | 
					            using (var processWrapper = new ProcessWrapper(process, this, _logger))
 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
                await resourcePool.WaitAsync(cancellationToken).ConfigureAwait(false);
 | 
					                await resourcePool.WaitAsync(cancellationToken).ConfigureAwait(false);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -965,7 +961,7 @@ namespace MediaBrowser.MediaEncoding.Encoder
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
                    if (!ranToCompletion)
 | 
					                    if (!ranToCompletion)
 | 
				
			||||||
                    {
 | 
					                    {
 | 
				
			||||||
                        StopProcess(processWrapper, 1000, false);
 | 
					                        StopProcess(processWrapper, 1000);
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
@ -1043,8 +1039,7 @@ namespace MediaBrowser.MediaEncoding.Encoder
 | 
				
			|||||||
                FileName = FFMpegPath,
 | 
					                FileName = FFMpegPath,
 | 
				
			||||||
                Arguments = args,
 | 
					                Arguments = args,
 | 
				
			||||||
                IsHidden = true,
 | 
					                IsHidden = true,
 | 
				
			||||||
                ErrorDialog = false,
 | 
					                ErrorDialog = false
 | 
				
			||||||
                RedirectStandardInput = true
 | 
					 | 
				
			||||||
            });
 | 
					            });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            _logger.Info(process.StartInfo.FileName + " " + process.StartInfo.Arguments);
 | 
					            _logger.Info(process.StartInfo.FileName + " " + process.StartInfo.Arguments);
 | 
				
			||||||
@ -1053,7 +1048,7 @@ namespace MediaBrowser.MediaEncoding.Encoder
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
            bool ranToCompletion = false;
 | 
					            bool ranToCompletion = false;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            using (var processWrapper = new ProcessWrapper(process, this, _logger, true))
 | 
					            using (var processWrapper = new ProcessWrapper(process, this, _logger))
 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
                try
 | 
					                try
 | 
				
			||||||
                {
 | 
					                {
 | 
				
			||||||
@ -1085,7 +1080,7 @@ namespace MediaBrowser.MediaEncoding.Encoder
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
                    if (!ranToCompletion)
 | 
					                    if (!ranToCompletion)
 | 
				
			||||||
                    {
 | 
					                    {
 | 
				
			||||||
                        StopProcess(processWrapper, 1000, false);
 | 
					                        StopProcess(processWrapper, 1000);
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
                finally
 | 
					                finally
 | 
				
			||||||
@ -1157,24 +1152,8 @@ namespace MediaBrowser.MediaEncoding.Encoder
 | 
				
			|||||||
                _runningProcesses.Add(process);
 | 
					                _runningProcesses.Add(process);
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        private void StopProcess(ProcessWrapper process, int waitTimeMs, bool enableForceKill)
 | 
					        private void StopProcess(ProcessWrapper process, int waitTimeMs)
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            try
 | 
					 | 
				
			||||||
            {
 | 
					 | 
				
			||||||
                _logger.Info("Killing ffmpeg process");
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
                if (process.IsRedirectingStdin)
 | 
					 | 
				
			||||||
                {
 | 
					 | 
				
			||||||
                    try
 | 
					 | 
				
			||||||
                    {
 | 
					 | 
				
			||||||
                        process.Process.StandardInput.WriteLine("q");
 | 
					 | 
				
			||||||
                    }
 | 
					 | 
				
			||||||
                    catch (Exception)
 | 
					 | 
				
			||||||
                    {
 | 
					 | 
				
			||||||
                        _logger.Error("Error sending q command to process");
 | 
					 | 
				
			||||||
                    }
 | 
					 | 
				
			||||||
                }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
            try
 | 
					            try
 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
                if (process.Process.WaitForExit(waitTimeMs))
 | 
					                if (process.Process.WaitForExit(waitTimeMs))
 | 
				
			||||||
@ -1187,11 +1166,12 @@ namespace MediaBrowser.MediaEncoding.Encoder
 | 
				
			|||||||
                _logger.Error("Error in WaitForExit", ex);
 | 
					                _logger.Error("Error in WaitForExit", ex);
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                if (enableForceKill)
 | 
					            try
 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
 | 
					                _logger.Info("Killing ffmpeg process");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                process.Process.Kill();
 | 
					                process.Process.Kill();
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
            catch (Exception ex)
 | 
					            catch (Exception ex)
 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
                _logger.ErrorException("Error killing process", ex);
 | 
					                _logger.ErrorException("Error killing process", ex);
 | 
				
			||||||
@ -1211,7 +1191,7 @@ namespace MediaBrowser.MediaEncoding.Encoder
 | 
				
			|||||||
            {
 | 
					            {
 | 
				
			||||||
                if (!process.HasExited)
 | 
					                if (!process.HasExited)
 | 
				
			||||||
                {
 | 
					                {
 | 
				
			||||||
                    StopProcess(process, 500, true);
 | 
					                    StopProcess(process, 500);
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
@ -1252,15 +1232,13 @@ namespace MediaBrowser.MediaEncoding.Encoder
 | 
				
			|||||||
            public int? ExitCode;
 | 
					            public int? ExitCode;
 | 
				
			||||||
            private readonly MediaEncoder _mediaEncoder;
 | 
					            private readonly MediaEncoder _mediaEncoder;
 | 
				
			||||||
            private readonly ILogger _logger;
 | 
					            private readonly ILogger _logger;
 | 
				
			||||||
            public bool IsRedirectingStdin { get; private set; }
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
            public ProcessWrapper(IProcess process, MediaEncoder mediaEncoder, ILogger logger, bool isRedirectingStdin)
 | 
					            public ProcessWrapper(IProcess process, MediaEncoder mediaEncoder, ILogger logger)
 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
                Process = process;
 | 
					                Process = process;
 | 
				
			||||||
                _mediaEncoder = mediaEncoder;
 | 
					                _mediaEncoder = mediaEncoder;
 | 
				
			||||||
                _logger = logger;
 | 
					                _logger = logger;
 | 
				
			||||||
                Process.Exited += Process_Exited;
 | 
					                Process.Exited += Process_Exited;
 | 
				
			||||||
                IsRedirectingStdin = isRedirectingStdin;
 | 
					 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            void Process_Exited(object sender, EventArgs e)
 | 
					            void Process_Exited(object sender, EventArgs e)
 | 
				
			||||||
 | 
				
			|||||||
@ -444,10 +444,6 @@ namespace MediaBrowser.MediaEncoding.Subtitles
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
            var process = _processFactory.Create(new ProcessOptions
 | 
					            var process = _processFactory.Create(new ProcessOptions
 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
                RedirectStandardOutput = false,
 | 
					 | 
				
			||||||
                RedirectStandardError = true,
 | 
					 | 
				
			||||||
                RedirectStandardInput = true,
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
                CreateNoWindow = true,
 | 
					                CreateNoWindow = true,
 | 
				
			||||||
                UseShellExecute = false,
 | 
					                UseShellExecute = false,
 | 
				
			||||||
                FileName = _mediaEncoder.EncoderPath,
 | 
					                FileName = _mediaEncoder.EncoderPath,
 | 
				
			||||||
@ -459,27 +455,17 @@ namespace MediaBrowser.MediaEncoding.Subtitles
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
            _logger.Info("{0} {1}", process.StartInfo.FileName, process.StartInfo.Arguments);
 | 
					            _logger.Info("{0} {1}", process.StartInfo.FileName, process.StartInfo.Arguments);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            var logFilePath = Path.Combine(_appPaths.LogDirectoryPath, "ffmpeg-sub-convert-" + Guid.NewGuid() + ".txt");
 | 
					 | 
				
			||||||
            _fileSystem.CreateDirectory(Path.GetDirectoryName(logFilePath));
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
            var logFileStream = _fileSystem.GetFileStream(logFilePath, FileOpenMode.Create, FileAccessMode.Write, FileShareMode.Read,
 | 
					 | 
				
			||||||
                true);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
            try
 | 
					            try
 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
                process.Start();
 | 
					                process.Start();
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            catch (Exception ex)
 | 
					            catch (Exception ex)
 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
                logFileStream.Dispose();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
                _logger.ErrorException("Error starting ffmpeg", ex);
 | 
					                _logger.ErrorException("Error starting ffmpeg", ex);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                throw;
 | 
					                throw;
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            var logTask = process.StandardError.BaseStream.CopyToAsync(logFileStream);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
            var ranToCompletion = process.WaitForExit(60000);
 | 
					            var ranToCompletion = process.WaitForExit(60000);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            if (!ranToCompletion)
 | 
					            if (!ranToCompletion)
 | 
				
			||||||
@ -488,19 +474,12 @@ namespace MediaBrowser.MediaEncoding.Subtitles
 | 
				
			|||||||
                {
 | 
					                {
 | 
				
			||||||
                    _logger.Info("Killing ffmpeg subtitle conversion process");
 | 
					                    _logger.Info("Killing ffmpeg subtitle conversion process");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                    process.StandardInput.WriteLine("q");
 | 
					                    process.Kill();
 | 
				
			||||||
                    process.WaitForExit(1000);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
                    await logTask.ConfigureAwait(false);
 | 
					 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
                catch (Exception ex)
 | 
					                catch (Exception ex)
 | 
				
			||||||
                {
 | 
					                {
 | 
				
			||||||
                    _logger.ErrorException("Error killing subtitle conversion process", ex);
 | 
					                    _logger.ErrorException("Error killing subtitle conversion process", ex);
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
                finally
 | 
					 | 
				
			||||||
                {
 | 
					 | 
				
			||||||
                    logFileStream.Dispose();
 | 
					 | 
				
			||||||
                }
 | 
					 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            var exitCode = ranToCompletion ? process.ExitCode : -1;
 | 
					            var exitCode = ranToCompletion ? process.ExitCode : -1;
 | 
				
			||||||
@ -533,13 +512,15 @@ namespace MediaBrowser.MediaEncoding.Subtitles
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
            if (failed)
 | 
					            if (failed)
 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
                var msg = string.Format("ffmpeg subtitle converted failed for {0}", inputPath);
 | 
					                var msg = string.Format("ffmpeg subtitle conversion failed for {0}", inputPath);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                _logger.Error(msg);
 | 
					                _logger.Error(msg);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                throw new Exception(msg);
 | 
					                throw new Exception(msg);
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            await SetAssFont(outputPath).ConfigureAwait(false);
 | 
					            await SetAssFont(outputPath).ConfigureAwait(false);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            _logger.Info("ffmpeg subtitle conversion succeeded for {0}", inputPath);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        /// <summary>
 | 
					        /// <summary>
 | 
				
			||||||
@ -597,10 +578,6 @@ namespace MediaBrowser.MediaEncoding.Subtitles
 | 
				
			|||||||
                CreateNoWindow = true,
 | 
					                CreateNoWindow = true,
 | 
				
			||||||
                UseShellExecute = false,
 | 
					                UseShellExecute = false,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                RedirectStandardOutput = false,
 | 
					 | 
				
			||||||
                RedirectStandardError = true,
 | 
					 | 
				
			||||||
                RedirectStandardInput = true,
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
                FileName = _mediaEncoder.EncoderPath,
 | 
					                FileName = _mediaEncoder.EncoderPath,
 | 
				
			||||||
                Arguments = processArgs,
 | 
					                Arguments = processArgs,
 | 
				
			||||||
                IsHidden = true,
 | 
					                IsHidden = true,
 | 
				
			||||||
@ -609,28 +586,17 @@ namespace MediaBrowser.MediaEncoding.Subtitles
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
            _logger.Info("{0} {1}", process.StartInfo.FileName, process.StartInfo.Arguments);
 | 
					            _logger.Info("{0} {1}", process.StartInfo.FileName, process.StartInfo.Arguments);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            var logFilePath = Path.Combine(_appPaths.LogDirectoryPath, "ffmpeg-sub-extract-" + Guid.NewGuid() + ".txt");
 | 
					 | 
				
			||||||
            _fileSystem.CreateDirectory(Path.GetDirectoryName(logFilePath));
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
            var logFileStream = _fileSystem.GetFileStream(logFilePath, FileOpenMode.Create, FileAccessMode.Write, FileShareMode.Read,
 | 
					 | 
				
			||||||
                true);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
            try
 | 
					            try
 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
                process.Start();
 | 
					                process.Start();
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            catch (Exception ex)
 | 
					            catch (Exception ex)
 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
                logFileStream.Dispose();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
                _logger.ErrorException("Error starting ffmpeg", ex);
 | 
					                _logger.ErrorException("Error starting ffmpeg", ex);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                throw;
 | 
					                throw;
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            // Important - don't await the log task or we won't be able to kill ffmpeg when the user stops playback
 | 
					 | 
				
			||||||
            Task.Run(() => StartStreamingLog(process.StandardError.BaseStream, logFileStream));
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
            var ranToCompletion = process.WaitForExit(300000);
 | 
					            var ranToCompletion = process.WaitForExit(300000);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            if (!ranToCompletion)
 | 
					            if (!ranToCompletion)
 | 
				
			||||||
@ -639,17 +605,12 @@ namespace MediaBrowser.MediaEncoding.Subtitles
 | 
				
			|||||||
                {
 | 
					                {
 | 
				
			||||||
                    _logger.Info("Killing ffmpeg subtitle extraction process");
 | 
					                    _logger.Info("Killing ffmpeg subtitle extraction process");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                    process.StandardInput.WriteLine("q");
 | 
					                    process.Kill();
 | 
				
			||||||
                    process.WaitForExit(1000);
 | 
					 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
                catch (Exception ex)
 | 
					                catch (Exception ex)
 | 
				
			||||||
                {
 | 
					                {
 | 
				
			||||||
                    _logger.ErrorException("Error killing subtitle extraction process", ex);
 | 
					                    _logger.ErrorException("Error killing subtitle extraction process", ex);
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
                finally
 | 
					 | 
				
			||||||
                {
 | 
					 | 
				
			||||||
                    logFileStream.Dispose();
 | 
					 | 
				
			||||||
                }
 | 
					 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            var exitCode = ranToCompletion ? process.ExitCode : -1;
 | 
					            var exitCode = ranToCompletion ? process.ExitCode : -1;
 | 
				
			||||||
@ -702,33 +663,6 @@ namespace MediaBrowser.MediaEncoding.Subtitles
 | 
				
			|||||||
            }
 | 
					            }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        private async Task StartStreamingLog(Stream source, Stream target)
 | 
					 | 
				
			||||||
        {
 | 
					 | 
				
			||||||
            try
 | 
					 | 
				
			||||||
            {
 | 
					 | 
				
			||||||
                using (var reader = new StreamReader(source))
 | 
					 | 
				
			||||||
                {
 | 
					 | 
				
			||||||
                    while (!reader.EndOfStream)
 | 
					 | 
				
			||||||
                    {
 | 
					 | 
				
			||||||
                        var line = await reader.ReadLineAsync().ConfigureAwait(false);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
                        var bytes = Encoding.UTF8.GetBytes(Environment.NewLine + line);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
                        await target.WriteAsync(bytes, 0, bytes.Length).ConfigureAwait(false);
 | 
					 | 
				
			||||||
                        await target.FlushAsync().ConfigureAwait(false);
 | 
					 | 
				
			||||||
                    }
 | 
					 | 
				
			||||||
                }
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
            catch (ObjectDisposedException)
 | 
					 | 
				
			||||||
            {
 | 
					 | 
				
			||||||
                // Don't spam the log. This doesn't seem to throw in windows, but sometimes under linux
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
            catch (Exception ex)
 | 
					 | 
				
			||||||
            {
 | 
					 | 
				
			||||||
                _logger.ErrorException("Error reading ffmpeg log", ex);
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        /// <summary>
 | 
					        /// <summary>
 | 
				
			||||||
        /// Sets the ass font.
 | 
					        /// Sets the ass font.
 | 
				
			||||||
        /// </summary>
 | 
					        /// </summary>
 | 
				
			||||||
 | 
				
			|||||||
@ -6,5 +6,7 @@ namespace MediaBrowser.Model.System
 | 
				
			|||||||
    {
 | 
					    {
 | 
				
			||||||
        event EventHandler Resume;
 | 
					        event EventHandler Resume;
 | 
				
			||||||
        event EventHandler Suspend;
 | 
					        event EventHandler Suspend;
 | 
				
			||||||
 | 
					        event EventHandler SessionLogoff;
 | 
				
			||||||
 | 
					        event EventHandler SystemShutdown;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -1,8 +1,6 @@
 | 
				
			|||||||
using MediaBrowser.Model.Logging;
 | 
					using MediaBrowser.Model.Logging;
 | 
				
			||||||
using MediaBrowser.Server.Implementations;
 | 
					 | 
				
			||||||
using MediaBrowser.Server.Mono.Native;
 | 
					using MediaBrowser.Server.Mono.Native;
 | 
				
			||||||
using MediaBrowser.Server.Startup.Common;
 | 
					using MediaBrowser.Server.Startup.Common;
 | 
				
			||||||
using Microsoft.Win32;
 | 
					 | 
				
			||||||
using System;
 | 
					using System;
 | 
				
			||||||
using System.Diagnostics;
 | 
					using System.Diagnostics;
 | 
				
			||||||
using System.Globalization;
 | 
					using System.Globalization;
 | 
				
			||||||
@ -14,7 +12,6 @@ using System.Reflection;
 | 
				
			|||||||
using System.Text.RegularExpressions;
 | 
					using System.Text.RegularExpressions;
 | 
				
			||||||
using System.Threading.Tasks;
 | 
					using System.Threading.Tasks;
 | 
				
			||||||
using Emby.Common.Implementations.EnvironmentInfo;
 | 
					using Emby.Common.Implementations.EnvironmentInfo;
 | 
				
			||||||
using Emby.Common.Implementations.IO;
 | 
					 | 
				
			||||||
using Emby.Common.Implementations.Logging;
 | 
					using Emby.Common.Implementations.Logging;
 | 
				
			||||||
using Emby.Common.Implementations.Networking;
 | 
					using Emby.Common.Implementations.Networking;
 | 
				
			||||||
using Emby.Common.Implementations.Security;
 | 
					using Emby.Common.Implementations.Security;
 | 
				
			||||||
@ -84,8 +81,6 @@ namespace MediaBrowser.Server.Mono
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
        private static void RunApplication(ServerApplicationPaths appPaths, ILogManager logManager, StartupOptions options)
 | 
					        private static void RunApplication(ServerApplicationPaths appPaths, ILogManager logManager, StartupOptions options)
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            Microsoft.Win32.SystemEvents.SessionEnding += SystemEvents_SessionEnding;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
            // Allow all https requests
 | 
					            // Allow all https requests
 | 
				
			||||||
            ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(delegate { return true; });
 | 
					            ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(delegate { return true; });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -108,7 +103,7 @@ namespace MediaBrowser.Server.Mono
 | 
				
			|||||||
                new MemoryStreamProvider(),
 | 
					                new MemoryStreamProvider(),
 | 
				
			||||||
                new NetworkManager(logManager.GetLogger("NetworkManager")),
 | 
					                new NetworkManager(logManager.GetLogger("NetworkManager")),
 | 
				
			||||||
                GenerateCertificate,
 | 
					                GenerateCertificate,
 | 
				
			||||||
                () => Environment.UserDomainName);
 | 
					                () => Environment.UserName);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            if (options.ContainsOption("-v"))
 | 
					            if (options.ContainsOption("-v"))
 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
@ -219,19 +214,6 @@ namespace MediaBrowser.Server.Mono
 | 
				
			|||||||
            public string machine = string.Empty;
 | 
					            public string machine = string.Empty;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        /// <summary>
 | 
					 | 
				
			||||||
        /// Handles the SessionEnding event of the SystemEvents control.
 | 
					 | 
				
			||||||
        /// </summary>
 | 
					 | 
				
			||||||
        /// <param name="sender">The source of the event.</param>
 | 
					 | 
				
			||||||
        /// <param name="e">The <see cref="SessionEndingEventArgs"/> instance containing the event data.</param>
 | 
					 | 
				
			||||||
        static void SystemEvents_SessionEnding(object sender, SessionEndingEventArgs e)
 | 
					 | 
				
			||||||
        {
 | 
					 | 
				
			||||||
            if (e.Reason == SessionEndReasons.SystemShutdown)
 | 
					 | 
				
			||||||
            {
 | 
					 | 
				
			||||||
                Shutdown();
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        /// <summary>
 | 
					        /// <summary>
 | 
				
			||||||
        /// Handles the UnhandledException event of the CurrentDomain control.
 | 
					        /// Handles the UnhandledException event of the CurrentDomain control.
 | 
				
			||||||
        /// </summary>
 | 
					        /// </summary>
 | 
				
			||||||
 | 
				
			|||||||
@ -9,6 +9,8 @@ namespace MediaBrowser.Server.Startup.Common
 | 
				
			|||||||
    {
 | 
					    {
 | 
				
			||||||
        public event EventHandler Resume;
 | 
					        public event EventHandler Resume;
 | 
				
			||||||
        public event EventHandler Suspend;
 | 
					        public event EventHandler Suspend;
 | 
				
			||||||
 | 
					        public event EventHandler SessionLogoff;
 | 
				
			||||||
 | 
					        public event EventHandler SystemShutdown;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        private readonly ILogger _logger;
 | 
					        private readonly ILogger _logger;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -16,6 +18,20 @@ namespace MediaBrowser.Server.Startup.Common
 | 
				
			|||||||
        {
 | 
					        {
 | 
				
			||||||
            _logger = logger;
 | 
					            _logger = logger;
 | 
				
			||||||
            Microsoft.Win32.SystemEvents.PowerModeChanged += SystemEvents_PowerModeChanged;
 | 
					            Microsoft.Win32.SystemEvents.PowerModeChanged += SystemEvents_PowerModeChanged;
 | 
				
			||||||
 | 
					            Microsoft.Win32.SystemEvents.SessionEnding += SystemEvents_SessionEnding;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        private void SystemEvents_SessionEnding(object sender, Microsoft.Win32.SessionEndingEventArgs e)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            switch (e.Reason)
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                case Microsoft.Win32.SessionEndReasons.Logoff:
 | 
				
			||||||
 | 
					                    EventHelper.FireEventIfNotNull(SessionLogoff, this, EventArgs.Empty, _logger);
 | 
				
			||||||
 | 
					                    break;
 | 
				
			||||||
 | 
					                case Microsoft.Win32.SessionEndReasons.SystemShutdown:
 | 
				
			||||||
 | 
					                    EventHelper.FireEventIfNotNull(SystemShutdown, this, EventArgs.Empty, _logger);
 | 
				
			||||||
 | 
					                    break;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        private void SystemEvents_PowerModeChanged(object sender, Microsoft.Win32.PowerModeChangedEventArgs e)
 | 
					        private void SystemEvents_PowerModeChanged(object sender, Microsoft.Win32.PowerModeChangedEventArgs e)
 | 
				
			||||||
 | 
				
			|||||||
@ -368,7 +368,6 @@ namespace MediaBrowser.ServerApplication
 | 
				
			|||||||
                task = InstallVcredist2013IfNeeded(_appHost, _logger);
 | 
					                task = InstallVcredist2013IfNeeded(_appHost, _logger);
 | 
				
			||||||
                Task.WaitAll(task);
 | 
					                Task.WaitAll(task);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                Microsoft.Win32.SystemEvents.SessionEnding += SystemEvents_SessionEnding;
 | 
					 | 
				
			||||||
                Microsoft.Win32.SystemEvents.SessionSwitch += SystemEvents_SessionSwitch;
 | 
					                Microsoft.Win32.SystemEvents.SessionSwitch += SystemEvents_SessionSwitch;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                HideSplashScreen();
 | 
					                HideSplashScreen();
 | 
				
			||||||
@ -569,19 +568,6 @@ namespace MediaBrowser.ServerApplication
 | 
				
			|||||||
            }
 | 
					            }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        /// <summary>
 | 
					 | 
				
			||||||
        /// Handles the SessionEnding event of the SystemEvents control.
 | 
					 | 
				
			||||||
        /// </summary>
 | 
					 | 
				
			||||||
        /// <param name="sender">The source of the event.</param>
 | 
					 | 
				
			||||||
        /// <param name="e">The <see cref="SessionEndingEventArgs"/> instance containing the event data.</param>
 | 
					 | 
				
			||||||
        static void SystemEvents_SessionEnding(object sender, SessionEndingEventArgs e)
 | 
					 | 
				
			||||||
        {
 | 
					 | 
				
			||||||
            if (e.Reason == SessionEndReasons.SystemShutdown || !IsRunningAsService)
 | 
					 | 
				
			||||||
            {
 | 
					 | 
				
			||||||
                Shutdown();
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        /// <summary>
 | 
					        /// <summary>
 | 
				
			||||||
        /// Handles the UnhandledException event of the CurrentDomain control.
 | 
					        /// Handles the UnhandledException event of the CurrentDomain control.
 | 
				
			||||||
        /// </summary>
 | 
					        /// </summary>
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user