aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLuke Pulverenti <luke.pulverenti@gmail.com>2013-06-10 00:00:44 -0400
committerLuke Pulverenti <luke.pulverenti@gmail.com>2013-06-10 00:00:44 -0400
commit4ab6a339c68f5c410523335061ff925549eba776 (patch)
tree0bc7bee66e0767eaf9cadc9942c92de3072e0319
parent8329710cf5527f24ba99ef03816edcf079a20a29 (diff)
fixed cleanup of encoded media
-rw-r--r--MediaBrowser.Api/ApiEntryPoint.cs132
-rw-r--r--MediaBrowser.Api/Playback/BaseStreamingService.cs37
-rw-r--r--MediaBrowser.Api/Playback/Hls/BaseHlsService.cs27
-rw-r--r--MediaBrowser.Api/Playback/Progressive/BaseProgressiveStreamingService.cs9
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);
- }
}
}