diff options
| -rw-r--r-- | MediaBrowser.Api/ApiEntryPoint.cs | 132 | ||||
| -rw-r--r-- | MediaBrowser.Api/Playback/BaseStreamingService.cs | 37 | ||||
| -rw-r--r-- | MediaBrowser.Api/Playback/Hls/BaseHlsService.cs | 27 | ||||
| -rw-r--r-- | MediaBrowser.Api/Playback/Progressive/BaseProgressiveStreamingService.cs | 9 |
4 files changed, 95 insertions, 110 deletions
diff --git a/MediaBrowser.Api/ApiEntryPoint.cs b/MediaBrowser.Api/ApiEntryPoint.cs index 90a6b368d..a2ed1d772 100644 --- a/MediaBrowser.Api/ApiEntryPoint.cs +++ b/MediaBrowser.Api/ApiEntryPoint.cs @@ -1,4 +1,5 @@ -using MediaBrowser.Controller.Plugins; +using System.IO; +using MediaBrowser.Controller.Plugins; using MediaBrowser.Model.Logging; using System; using System.Collections.Generic; @@ -188,36 +189,10 @@ namespace MediaBrowser.Api } /// <summary> - /// Called when [transcoding finished]. - /// </summary> - /// <param name="path">The path.</param> - /// <param name="type">The type.</param> - public void OnTranscodingFinished(string path, TranscodingJobType type) - { - lock (_activeTranscodingJobs) - { - var job = _activeTranscodingJobs.FirstOrDefault(j => j.Type == type && j.Path.Equals(path, StringComparison.OrdinalIgnoreCase)); - - if (job == null) - { - return; - } - - _activeTranscodingJobs.Remove(job); - - if (job.KillTimer != null) - { - job.KillTimer.Dispose(); - job.KillTimer = null; - } - } - } - - /// <summary> /// Called when [transcode kill timer stopped]. /// </summary> /// <param name="state">The state.</param> - private void OnTranscodeKillTimerStopped(object state) + private async void OnTranscodeKillTimerStopped(object state) { var job = (TranscodingJob)state; @@ -253,31 +228,110 @@ namespace MediaBrowser.Api Logger.ErrorException("Error determining if ffmpeg process has exited for {0}", ex, job.Path); } - if (hasExited) + if (!hasExited) { - return; + try + { + Logger.Info("Killing ffmpeg process for {0}", job.Path); + + process.Kill(); + + // Need to wait because killing is asynchronous + process.WaitForExit(5000); + } + catch (Win32Exception ex) + { + Logger.ErrorException("Error killing transcoding job for {0}", ex, job.Path); + } + catch (InvalidOperationException ex) + { + Logger.ErrorException("Error killing transcoding job for {0}", ex, job.Path); + } + catch (NotSupportedException ex) + { + Logger.ErrorException("Error killing transcoding job for {0}", ex, job.Path); + } } + // Determine if it exited successfully + var hasExitedSuccessfully = false; + try { - Logger.Info("Killing ffmpeg process for {0}", job.Path); - - process.Kill(); + hasExitedSuccessfully = process.ExitCode == 0; } - catch (Win32Exception ex) + catch (InvalidOperationException) { - Logger.ErrorException("Error killing transcoding job for {0}", ex, job.Path); + } - catch (InvalidOperationException ex) + catch (NotSupportedException) { - Logger.ErrorException("Error killing transcoding job for {0}", ex, job.Path); + } - catch (NotSupportedException ex) + + // Dispose the process + process.Dispose(); + + // If it didn't complete successfully cleanup the partial files + if (!hasExitedSuccessfully) { - Logger.ErrorException("Error killing transcoding job for {0}", ex, job.Path); + Logger.Info("Deleting partial stream file(s) {0}", job.Path); + + await Task.Delay(1000).ConfigureAwait(false); + + try + { + if (job.Type == TranscodingJobType.Progressive) + { + DeleteProgressivePartialStreamFiles(job.Path); + } + else + { + DeleteHlsPartialStreamFiles(job.Path); + } + } + catch (IOException ex) + { + Logger.ErrorException("Error deleting partial stream file(s) {0}", ex, job.Path); + } } } + /// <summary> + /// Deletes the progressive partial stream files. + /// </summary> + /// <param name="outputFilePath">The output file path.</param> + private void DeleteProgressivePartialStreamFiles(string outputFilePath) + { + File.Delete(outputFilePath); + } + + /// <summary> + /// Deletes the HLS partial stream files. + /// </summary> + /// <param name="outputFilePath">The output file path.</param> + private void DeleteHlsPartialStreamFiles(string outputFilePath) + { + var directory = Path.GetDirectoryName(outputFilePath); + var name = Path.GetFileNameWithoutExtension(outputFilePath); + + var filesToDelete = Directory.EnumerateFiles(directory) + .Where(f => f.IndexOf(name, StringComparison.OrdinalIgnoreCase) != -1) + .ToList(); + + foreach (var file in filesToDelete) + { + try + { + Logger.Info("Deleting HLS file {0}", file); + File.Delete(file); + } + catch (IOException ex) + { + Logger.ErrorException("Error deleting HLS file {0}", ex, file); + } + } + } } /// <summary> diff --git a/MediaBrowser.Api/Playback/BaseStreamingService.cs b/MediaBrowser.Api/Playback/BaseStreamingService.cs index e119b940f..4886af916 100644 --- a/MediaBrowser.Api/Playback/BaseStreamingService.cs +++ b/MediaBrowser.Api/Playback/BaseStreamingService.cs @@ -674,7 +674,7 @@ namespace MediaBrowser.Api.Playback /// </summary> /// <param name="process">The process.</param> /// <param name="state">The state.</param> - protected async void OnFfMpegProcessExited(Process process, StreamState state) + protected void OnFfMpegProcessExited(Process process, StreamState state) { if (state.IsoMount != null) { @@ -686,50 +686,17 @@ namespace MediaBrowser.Api.Playback state.LogFileStream.Dispose(); - int? exitCode = null; - try { - exitCode = process.ExitCode; - Logger.Info("FFMpeg exited with code {0} for {1}", exitCode.Value, outputFilePath); + Logger.Info("FFMpeg exited with code {0} for {1}", process.ExitCode, outputFilePath); } catch { Logger.Info("FFMpeg exited with an error for {0}", outputFilePath); } - - process.Dispose(); - - ApiEntryPoint.Instance.OnTranscodingFinished(outputFilePath, TranscodingJobType); - - if (!exitCode.HasValue || exitCode.Value != 0) - { - Logger.Info("Deleting partial stream file(s) {0}", outputFilePath); - - await Task.Delay(1000).ConfigureAwait(false); - - try - { - DeletePartialStreamFiles(outputFilePath); - } - catch (IOException ex) - { - Logger.ErrorException("Error deleting partial stream file(s) {0}", ex, outputFilePath); - } - } - else - { - Logger.Info("FFMpeg completed and exited normally for {0}", outputFilePath); - } } /// <summary> - /// Deletes the partial stream files. - /// </summary> - /// <param name="outputFilePath">The output file path.</param> - protected abstract void DeletePartialStreamFiles(string outputFilePath); - - /// <summary> /// Gets the state. /// </summary> /// <param name="request">The request.</param> diff --git a/MediaBrowser.Api/Playback/Hls/BaseHlsService.cs b/MediaBrowser.Api/Playback/Hls/BaseHlsService.cs index a4fc6600a..985288e6f 100644 --- a/MediaBrowser.Api/Playback/Hls/BaseHlsService.cs +++ b/MediaBrowser.Api/Playback/Hls/BaseHlsService.cs @@ -207,32 +207,5 @@ namespace MediaBrowser.Api.Playback.Hls segmentOutputPath ).Trim(); } - - /// <summary> - /// Deletes the partial stream files. - /// </summary> - /// <param name="outputFilePath">The output file path.</param> - protected override void DeletePartialStreamFiles(string outputFilePath) - { - var directory = Path.GetDirectoryName(outputFilePath); - var name = Path.GetFileNameWithoutExtension(outputFilePath); - - var filesToDelete = Directory.EnumerateFiles(directory) - .Where(f => f.IndexOf(name, StringComparison.OrdinalIgnoreCase) != -1) - .ToList(); - - foreach (var file in filesToDelete) - { - try - { - Logger.Info("Deleting HLS file {0}", file); - File.Delete(file); - } - catch (IOException ex) - { - Logger.ErrorException("Error deleting HLS file {0}", ex, file); - } - } - } } } diff --git a/MediaBrowser.Api/Playback/Progressive/BaseProgressiveStreamingService.cs b/MediaBrowser.Api/Playback/Progressive/BaseProgressiveStreamingService.cs index ab1fb4f90..cd8423c3d 100644 --- a/MediaBrowser.Api/Playback/Progressive/BaseProgressiveStreamingService.cs +++ b/MediaBrowser.Api/Playback/Progressive/BaseProgressiveStreamingService.cs @@ -357,14 +357,5 @@ namespace MediaBrowser.Api.Playback.Progressive return result; } - - /// <summary> - /// Deletes the partial stream files. - /// </summary> - /// <param name="outputFilePath">The output file path.</param> - protected override void DeletePartialStreamFiles(string outputFilePath) - { - File.Delete(outputFilePath); - } } } |
