diff --git a/Quaver.API.Tests/AutoMods/Resources/high-bitrate.ogg b/Quaver.API.Tests/AutoMods/Resources/high-bitrate.ogg new file mode 100644 index 000000000..408e35866 Binary files /dev/null and b/Quaver.API.Tests/AutoMods/Resources/high-bitrate.ogg differ diff --git a/Quaver.API.Tests/AutoMods/TestCaseAutoMod.cs b/Quaver.API.Tests/AutoMods/TestCaseAutoMod.cs index 7538269b9..951ffd7ff 100644 --- a/Quaver.API.Tests/AutoMods/TestCaseAutoMod.cs +++ b/Quaver.API.Tests/AutoMods/TestCaseAutoMod.cs @@ -244,16 +244,48 @@ public void DetectAudioBitrateTooHigh() var autoMod = new AutoMod(Qua.Parse("./AutoMods/Resources/high-bitrate.qua", false)); autoMod.Run(); - Assert.Contains(autoMod.Issues, x => x is AutoModIssueAudioBitrate); + Assert.Contains(autoMod.Issues, x => x is AutoModIssueAudioBitrate issue + && issue.AudioFormat == "MP3" + && issue.MaxBitrate == AutoMod.MaxMp3AudioBitrate); } [Fact] - public void DetectWrongAudioFormat() + public void AllowSupportedOggAudio() { var autoMod = new AutoMod(Qua.Parse("./AutoMods/Resources/wrong-audio-format.qua", false)); autoMod.Run(); + Assert.NotNull(autoMod.AudioTrackInfo); + Assert.DoesNotContain(autoMod.Issues, x => x is AutoModIssueAudioFormat); + Assert.DoesNotContain(autoMod.Issues, x => x is AutoModIssueAudioBitrate); + } + + [Fact] + public void DetectOggAudioBitrateTooHigh() + { + var qua = Qua.Parse("./AutoMods/Resources/wrong-audio-format.qua", false); + qua.AudioFile = "high-bitrate.ogg"; + + var autoMod = new AutoMod(qua); + autoMod.Run(); + + Assert.DoesNotContain(autoMod.Issues, x => x is AutoModIssueAudioFormat); + Assert.Contains(autoMod.Issues, x => x is AutoModIssueAudioBitrate issue + && issue.AudioFormat == "OGG" + && issue.MaxBitrate == AutoMod.MaxOggAudioBitrate); + } + + [Fact] + public void DetectUnsupportedAudioFormat() + { + var qua = Qua.Parse("./AutoMods/Resources/wrong-audio-format.qua", false); + qua.AudioFile = "unsupported.wav"; + + var autoMod = new AutoMod(qua); + autoMod.Run(); + Assert.Contains(autoMod.Issues, x => x is AutoModIssueAudioFormat); + Assert.DoesNotContain(autoMod.Issues, x => x is AutoModIssueAudioBitrate); } [Fact] @@ -298,4 +330,4 @@ public void DetectMultiModeDiffNameIssues() issue.Map.Mode == GameMode.Keys7); } } -} \ No newline at end of file +} diff --git a/Quaver.API/Maps/AutoMod/AutoMod.cs b/Quaver.API/Maps/AutoMod/AutoMod.cs index ff418224e..e1a9711c5 100644 --- a/Quaver.API/Maps/AutoMod/AutoMod.cs +++ b/Quaver.API/Maps/AutoMod/AutoMod.cs @@ -73,6 +73,16 @@ public class AutoMod /// public const int MaxBannerFileSize = 2000000; + /// + /// The maximum allowed bitrate for MP3 audio files. + /// + public const int MaxMp3AudioBitrate = 192; + + /// + /// The maximum allowed bitrate for OGG audio files. + /// + public const int MaxOggAudioBitrate = 208; + /// /// /// @@ -462,14 +472,21 @@ private void DetectImageFileIssues(string item, string path, int maxSize, int mi /// private void DetectAudioFileIssues() { + var extension = Path.GetExtension(Qua.AudioFile)?.ToLowerInvariant(); + + if (extension != ".mp3" && extension != ".ogg") + { + Issues.Add(new AutoModIssueAudioFormat()); + return; + } + if (AudioTrackInfo == null) return; - if (Path.GetExtension(AudioTrackInfo.Path).ToLower() != ".mp3") - Issues.Add(new AutoModIssueAudioFormat()); + var maxBitrate = extension == ".ogg" ? MaxOggAudioBitrate : MaxMp3AudioBitrate; - if (AudioTrackInfo.Bitrate > 192) - Issues.Add(new AutoModIssueAudioBitrate()); + if (AudioTrackInfo.Bitrate > maxBitrate) + Issues.Add(new AutoModIssueAudioBitrate(extension.Substring(1).ToUpperInvariant(), maxBitrate)); } } } diff --git a/Quaver.API/Maps/AutoMod/Issues/Audio/AutoModIssueAudioBitrate.cs b/Quaver.API/Maps/AutoMod/Issues/Audio/AutoModIssueAudioBitrate.cs index b1d1c1090..245212b6e 100644 --- a/Quaver.API/Maps/AutoMod/Issues/Audio/AutoModIssueAudioBitrate.cs +++ b/Quaver.API/Maps/AutoMod/Issues/Audio/AutoModIssueAudioBitrate.cs @@ -4,7 +4,20 @@ public class AutoModIssueAudioBitrate : AutoModIssue { public override AutoModIssueCategory Category { get; protected set; } = AutoModIssueCategory.Files; - public AutoModIssueAudioBitrate() : base(AutoModIssueLevel.Ranking) - => Text = $"The mp3's bitrate must be 192kbps or lower."; + public string AudioFormat { get; } + + public int MaxBitrate { get; } + + public AutoModIssueAudioBitrate() + : this("MP3", global::Quaver.API.Maps.AutoMod.AutoMod.MaxMp3AudioBitrate) + { + } + + public AutoModIssueAudioBitrate(string audioFormat, int maxBitrate) : base(AutoModIssueLevel.Ranking) + { + AudioFormat = audioFormat; + MaxBitrate = maxBitrate; + Text = $"The {audioFormat} audio bitrate must be {maxBitrate}kbps or lower."; + } } -} \ No newline at end of file +} diff --git a/Quaver.API/Maps/AutoMod/Issues/Audio/AutoModIssueAudioFormat.cs b/Quaver.API/Maps/AutoMod/Issues/Audio/AutoModIssueAudioFormat.cs index 0dce03338..e0ad84d21 100644 --- a/Quaver.API/Maps/AutoMod/Issues/Audio/AutoModIssueAudioFormat.cs +++ b/Quaver.API/Maps/AutoMod/Issues/Audio/AutoModIssueAudioFormat.cs @@ -5,6 +5,6 @@ public class AutoModIssueAudioFormat : AutoModIssue public override AutoModIssueCategory Category { get; protected set; } = AutoModIssueCategory.Files; public AutoModIssueAudioFormat() : base(AutoModIssueLevel.Ranking) - => Text = $"The audio file format must be mp3."; + => Text = "The audio file format must be MP3 or OGG."; } -} \ No newline at end of file +}