From 2a8c67badcb10d2d74480167a9d7f5e8fee1a635 Mon Sep 17 00:00:00 2001 From: Qstick Date: Thu, 25 Jan 2024 20:51:55 -0600 Subject: [PATCH] New: Preserve replaygain tags --- .../MediaFiles/AudioTagServiceFixture.cs | 34 ++++++++++++++++++- .../MediaFiles/AudioTagService.cs | 16 +++++++++ 2 files changed, 49 insertions(+), 1 deletion(-) diff --git a/src/NzbDrone.Core.Test/MediaFiles/AudioTagServiceFixture.cs b/src/NzbDrone.Core.Test/MediaFiles/AudioTagServiceFixture.cs index 1b155c1df..cfc6259c4 100644 --- a/src/NzbDrone.Core.Test/MediaFiles/AudioTagServiceFixture.cs +++ b/src/NzbDrone.Core.Test/MediaFiles/AudioTagServiceFixture.cs @@ -326,7 +326,7 @@ namespace NzbDrone.Core.Test.MediaFiles.AudioTagServiceFixture [Test] public void should_ignore_non_parsable_id3v23_date() { - GivenFileCopy("nin.mp2"); + GivenFileCopy("nin.mp3"); using (var file = TagLib.File.Create(_copiedFile)) { @@ -440,5 +440,37 @@ namespace NzbDrone.Core.Test.MediaFiles.AudioTagServiceFixture Mocker.GetMock() .Verify(v => v.PublishEvent(It.IsAny()), Times.Once()); } + + [TestCase("nin.mp3")] + public void should_ignore_replaygain_tags_during_scrub(string filename) + { + Mocker.GetMock() + .Setup(x => x.ScrubAudioTags) + .Returns(true); + + GivenFileCopy(filename); + + using (var preFile = TagLib.File.Create(_copiedFile)) + { + preFile.Tag.ReplayGainAlbumPeak = 1; + preFile.Tag.ReplayGainAlbumGain = 500; + preFile.Tag.ReplayGainTrackPeak = 2; + preFile.Tag.ReplayGainTrackGain = 250; + preFile.Save(); + } + + var file = GivenPopulatedTrackfile(0); + + file.Path = _copiedFile; + Subject.WriteTags(file, false, true); + + using (var postFile = TagLib.File.Create(_copiedFile)) + { + postFile.Tag.ReplayGainAlbumGain.Should().Be(500); + postFile.Tag.ReplayGainAlbumPeak.Should().Be(1); + postFile.Tag.ReplayGainTrackGain.Should().Be(250); + postFile.Tag.ReplayGainTrackPeak.Should().Be(2); + } + } } } diff --git a/src/NzbDrone.Core/MediaFiles/AudioTagService.cs b/src/NzbDrone.Core/MediaFiles/AudioTagService.cs index abb727111..6c0bdc4f3 100644 --- a/src/NzbDrone.Core/MediaFiles/AudioTagService.cs +++ b/src/NzbDrone.Core/MediaFiles/AudioTagService.cs @@ -151,8 +151,24 @@ namespace NzbDrone.Core.MediaFiles try { file = TagLib.File.Create(path); + + var replayGainAlbumGain = file.Tag.ReplayGainAlbumGain; + var replayGainAlbumPeak = file.Tag.ReplayGainAlbumPeak; + var replayGainTrackGain = file.Tag.ReplayGainTrackGain; + var replayGainTrackPeak = file.Tag.ReplayGainTrackPeak; + file.RemoveTags(TagLib.TagTypes.AllTags); file.Save(); + file.Dispose(); + + file = TagLib.File.Create(path); + + file.Tag.ReplayGainAlbumGain = replayGainAlbumGain; + file.Tag.ReplayGainAlbumPeak = replayGainAlbumPeak; + file.Tag.ReplayGainTrackGain = replayGainTrackGain; + file.Tag.ReplayGainTrackPeak = replayGainTrackPeak; + + file.Save(); } catch (CorruptFileException ex) {