From 7ac105f113fb50aced44a3e507625283ad6098a5 Mon Sep 17 00:00:00 2001 From: XShine555 Date: Tue, 14 Jul 2026 13:49:28 +0200 Subject: [PATCH] refactor(backend): return AudioTranscodeResult with status code and duration --- .../Musify.Application/Contracts/AudioTranscodeResult.cs | 4 ++++ .../Contracts/IAudioTranscoderService.cs | 2 +- .../Activities/Audio/TranscodeAudioActivity.cs | 9 ++++++--- .../Services/AudioTranscoderService.cs | 7 ++++--- 4 files changed, 15 insertions(+), 7 deletions(-) create mode 100644 backend/Musify.Application/Contracts/AudioTranscodeResult.cs diff --git a/backend/Musify.Application/Contracts/AudioTranscodeResult.cs b/backend/Musify.Application/Contracts/AudioTranscodeResult.cs new file mode 100644 index 0000000..43902f1 --- /dev/null +++ b/backend/Musify.Application/Contracts/AudioTranscodeResult.cs @@ -0,0 +1,4 @@ +namespace Musify.Application.Contracts +{ + public record AudioTranscodeResult(int StatusCode, TimeSpan Duration); +} diff --git a/backend/Musify.Application/Contracts/IAudioTranscoderService.cs b/backend/Musify.Application/Contracts/IAudioTranscoderService.cs index 190f737..6f6c885 100644 --- a/backend/Musify.Application/Contracts/IAudioTranscoderService.cs +++ b/backend/Musify.Application/Contracts/IAudioTranscoderService.cs @@ -2,7 +2,7 @@ namespace Musify.Application.Contracts { public interface IAudioTranscoderService { - Task TranscodeToAudioFileAsync(Stream audioStream, string destinationPath, CancellationToken cancellationToken); + Task TranscodeToAudioFileAsync(Stream audioStream, string destinationPath, CancellationToken cancellationToken); Task IsValidAudioFileAsync(string filePath, CancellationToken cancellationToken); } diff --git a/backend/Musify.Infrastructure/MassTransit/Activities/Audio/TranscodeAudioActivity.cs b/backend/Musify.Infrastructure/MassTransit/Activities/Audio/TranscodeAudioActivity.cs index 97ca6a0..ef5a86b 100644 --- a/backend/Musify.Infrastructure/MassTransit/Activities/Audio/TranscodeAudioActivity.cs +++ b/backend/Musify.Infrastructure/MassTransit/Activities/Audio/TranscodeAudioActivity.cs @@ -38,21 +38,24 @@ namespace Musify.Infrastructure.MassTransit.Activities.Audio try { - TimeSpan duration; + AudioTranscodeResult transcodeResult; await using (var fileStream = File.OpenRead(sourceFilePath)) { - duration = await audioTranscoder.TranscodeToAudioFileAsync( + transcodeResult = await audioTranscoder.TranscodeToAudioFileAsync( fileStream, workingDirectory, executeContext.CancellationToken); } + if (transcodeResult.StatusCode != 0) + throw new InvalidOperationException($"ffmpeg transcoding failed with exit code {transcodeResult.StatusCode}."); + File.Delete(sourceFilePath); var log = new TranscodeAudioLog(workingDirectory); return executeContext.CompletedWithVariables(log, new Dictionary { - [RoutingSlipVariableNames.Audio.DurationSeconds] = (int)Math.Round(duration.TotalSeconds) + [RoutingSlipVariableNames.Audio.DurationSeconds] = (int)Math.Round(transcodeResult.Duration.TotalSeconds) } ); } catch (Exception exception) diff --git a/backend/Musify.Infrastructure/Services/AudioTranscoderService.cs b/backend/Musify.Infrastructure/Services/AudioTranscoderService.cs index 7fc83a4..f22991c 100644 --- a/backend/Musify.Infrastructure/Services/AudioTranscoderService.cs +++ b/backend/Musify.Infrastructure/Services/AudioTranscoderService.cs @@ -16,7 +16,7 @@ namespace Musify.Infrastructure.Services [GeneratedRegex(@"Duration:\s*(\d+):(\d{2}):(\d{2}(?:\.\d+)?)", RegexOptions.IgnoreCase)] private static partial Regex DurationRegex(); - public async Task TranscodeToAudioFileAsync(Stream audioStream, string destinationPath, CancellationToken cancellationToken) + public async Task TranscodeToAudioFileAsync(Stream audioStream, string destinationPath, CancellationToken cancellationToken) { try { @@ -35,13 +35,14 @@ namespace Musify.Infrastructure.Services { logger.LogError("Audio transcoding failed with exit code {ExitCode}. Output: {StandardOutput}, Error: {StandardError}", executionResult.ExitCode, executionResult.StandardOutput, executionResult.StandardError); - throw new InvalidOperationException($"ffmpeg transcoding failed with exit code {executionResult.ExitCode}."); + return new AudioTranscodeResult(executionResult.ExitCode, TimeSpan.Zero); } logger.LogInformation("Audio transcoding completed for {DestinationPath}", destinationPath); var outputPath = Path.Combine(destinationPath, audioTranscoderConfiguration.Ffmpeg.OutputFileName); - return await GetAudioDurationAsync(outputPath, cancellationToken); + var duration = await GetAudioDurationAsync(outputPath, cancellationToken); + return new AudioTranscodeResult(executionResult.ExitCode, duration); } catch (TimeoutException timeoutException) {