Jelajahi Sumber

Merge pull request #13593 from Bond-009/stupidwindows

Wait for ffmpeg to exit on Windows before we try deleting the concat file
Bond-009 3 bulan lalu
induk
melakukan
346f36bc09

+ 20 - 6
Emby.Server.Implementations/ScheduledTasks/Tasks/AudioNormalizationTask.cs

@@ -116,6 +116,7 @@ public partial class AudioNormalizationTask : IScheduledTask
                 {
                     a.LUFS = await CalculateLUFSAsync(
                         string.Format(CultureInfo.InvariantCulture, "-f concat -safe 0 -i \"{0}\"", tempFile),
+                        OperatingSystem.IsWindows(), // Wait for process to exit on Windows before we try deleting the concat file
                         cancellationToken).ConfigureAwait(false);
                 }
                 finally
@@ -142,7 +143,10 @@ public partial class AudioNormalizationTask : IScheduledTask
                     continue;
                 }
 
-                t.LUFS = await CalculateLUFSAsync(string.Format(CultureInfo.InvariantCulture, "-i \"{0}\"", t.Path.Replace("\"", "\\\"", StringComparison.Ordinal)), cancellationToken).ConfigureAwait(false);
+                t.LUFS = await CalculateLUFSAsync(
+                    string.Format(CultureInfo.InvariantCulture, "-i \"{0}\"", t.Path.Replace("\"", "\\\"", StringComparison.Ordinal)),
+                    false,
+                    cancellationToken).ConfigureAwait(false);
             }
 
             _itemRepository.SaveItems(tracks, cancellationToken);
@@ -162,7 +166,7 @@ public partial class AudioNormalizationTask : IScheduledTask
         ];
     }
 
-    private async Task<float?> CalculateLUFSAsync(string inputArgs, CancellationToken cancellationToken)
+    private async Task<float?> CalculateLUFSAsync(string inputArgs, bool waitForExit, CancellationToken cancellationToken)
     {
         var args = $"-hide_banner {inputArgs} -af ebur128=framelog=verbose -f null -";
 
@@ -189,18 +193,28 @@ public partial class AudioNormalizationTask : IScheduledTask
             }
 
             using var reader = process.StandardError;
+            float? lufs = null;
             await foreach (var line in reader.ReadAllLinesAsync(cancellationToken))
             {
                 Match match = LUFSRegex().Match(line);
-
                 if (match.Success)
                 {
-                    return float.Parse(match.Groups[1].ValueSpan, CultureInfo.InvariantCulture.NumberFormat);
+                    lufs = float.Parse(match.Groups[1].ValueSpan, CultureInfo.InvariantCulture.NumberFormat);
+                    break;
                 }
             }
 
-            _logger.LogError("Failed to find LUFS value in output");
-            return null;
+            if (lufs is null)
+            {
+                _logger.LogError("Failed to find LUFS value in output");
+            }
+
+            if (waitForExit)
+            {
+                await process.WaitForExitAsync(cancellationToken).ConfigureAwait(false);
+            }
+
+            return lufs;
         }
     }
 }