diff --git a/src/StreamShorts.Library/Media/Audio/AudioExtractor.cs b/src/StreamShorts.Library/Media/Audio/AudioExtractor.cs
index e852638..ca21e86 100644
--- a/src/StreamShorts.Library/Media/Audio/AudioExtractor.cs
+++ b/src/StreamShorts.Library/Media/Audio/AudioExtractor.cs
@@ -32,14 +32,9 @@ public sealed class AudioExtractor : IAudioExtractor
throw new ArgumentNullException(nameof(video), "Video stream cannot be null");
}
- if (video.CanRead is false)
+ if (IsVideoStreamUsable(video) is false)
{
- throw new ArgumentException("Video stream must be readable", nameof(video));
- }
-
- if (video.CanSeek is false)
- {
- throw new ArgumentException("Video stream must be seekable", nameof(video));
+ throw new ArgumentException("Stream must be non-null, readable, and seekable", nameof(video));
}
if (audio is null)
@@ -47,9 +42,9 @@ public sealed class AudioExtractor : IAudioExtractor
throw new ArgumentNullException(nameof(audio), "Audio stream cannot be null");
}
- if (audio.CanWrite is false)
+ if (IsAudioStreamUsable(audio) is false)
{
- throw new ArgumentException("Audio stream must be writable", nameof(audio));
+ throw new ArgumentException("Stream must be non-null, writable, and seekable", nameof(audio));
}
var originalPosition = video.Position;
@@ -75,4 +70,14 @@ public sealed class AudioExtractor : IAudioExtractor
video.Position = originalPosition;
}
}
+
+ private static bool IsVideoStreamUsable(Stream stream)
+ {
+ return stream.CanRead && stream.CanSeek;
+ }
+
+ private static bool IsAudioStreamUsable(Stream stream)
+ {
+ return stream.CanWrite && stream.CanSeek;
+ }
}
\ No newline at end of file
diff --git a/src/StreamShorts.Library/Media/Audio/IAudioExtractor.cs b/src/StreamShorts.Library/Media/Audio/IAudioExtractor.cs
index 61f4954..6730c18 100644
--- a/src/StreamShorts.Library/Media/Audio/IAudioExtractor.cs
+++ b/src/StreamShorts.Library/Media/Audio/IAudioExtractor.cs
@@ -16,6 +16,7 @@ public interface IAudioExtractor
/// Thrown when the video stream is not seekable.
/// Thrown when the audio stream is null.
/// Thrown when the audio stream is not writable.
+ /// Thrown when the audio stream is not seekable.
/// Thrown when the audio extraction fails.
/// The method will preserve the passed video stream's data and position.
Task ExtractMp3FromMp4Async(Stream video, Stream audio);