From 0845a4bf4c9a22397a684793354df3e1c818ac12 Mon Sep 17 00:00:00 2001 From: Qstick Date: Tue, 24 Dec 2019 01:24:47 -0500 Subject: [PATCH] Fixed: Handle 3 digit audio channels --- .../FormatAudioChannelsFixture.cs | 44 ++++++++++++------- .../MediaInfo/MediaInfoFormatter.cs | 28 ++++++++++-- 2 files changed, 53 insertions(+), 19 deletions(-) diff --git a/src/NzbDrone.Core.Test/MediaFiles/MediaInfo/MediaInfoFormatterTests/FormatAudioChannelsFixture.cs b/src/NzbDrone.Core.Test/MediaFiles/MediaInfo/MediaInfoFormatterTests/FormatAudioChannelsFixture.cs index 68c203107..b3fc9f2cf 100644 --- a/src/NzbDrone.Core.Test/MediaFiles/MediaInfo/MediaInfoFormatterTests/FormatAudioChannelsFixture.cs +++ b/src/NzbDrone.Core.Test/MediaFiles/MediaInfo/MediaInfoFormatterTests/FormatAudioChannelsFixture.cs @@ -90,6 +90,20 @@ namespace NzbDrone.Core.Test.MediaFiles.MediaInfo.MediaInfoFormatterTests MediaInfoFormatter.FormatAudioChannels(mediaInfoModel).Should().Be(5.1m); } + [Test] + public void should_handle_AudioChannelPositions_three_digits() + { + var mediaInfoModel = new MediaInfoModel + { + AudioChannels = 2, + AudioChannelPositions = "3/2/0.2.1", + AudioChannelPositionsText = null, + SchemaRevision = 3 + }; + + MediaInfoFormatter.FormatAudioChannels(mediaInfoModel).Should().Be(7.1m); + } + [Test] public void should_cleanup_extraneous_text_from_AudioChannelPositions() { @@ -132,6 +146,20 @@ namespace NzbDrone.Core.Test.MediaFiles.MediaInfo.MediaInfoFormatterTests MediaInfoFormatter.FormatAudioChannels(mediaInfoModel).Should().Be(7.1m); } + [Test] + public void should_sum_first_series_of_numbers_from_AudioChannelPositions_with_three_digits() + { + var mediaInfoModel = new MediaInfoModel + { + AudioChannels = 2, + AudioChannelPositions = "3/2/0.2.1 / 3/2/0.1", + AudioChannelPositionsText = null, + SchemaRevision = 3 + }; + + MediaInfoFormatter.FormatAudioChannels(mediaInfoModel).Should().Be(7.1m); + } + [Test] public void should_sum_dual_mono_representation_AudioChannelPositions() { @@ -173,21 +201,5 @@ namespace NzbDrone.Core.Test.MediaFiles.MediaInfo.MediaInfoFormatterTests MediaInfoFormatter.FormatAudioChannels(mediaInfoModel).Should().Be(5.1m); } - - [Test] - public void should_warn_unknown_AudioChannelPostions() - { - var mediaInfoModel = new MediaInfoModel - { - AudioChannels = 2, - AudioChannelPositions = "3/2/0.2.1", - AudioChannelPositionsText = null, - SchemaRevision = 3 - }; - - MediaInfoFormatter.FormatAudioChannels(mediaInfoModel).Should().Be(2m); - - ExceptionVerification.ExpectedWarns(1); - } } } diff --git a/src/NzbDrone.Core/MediaFiles/MediaInfo/MediaInfoFormatter.cs b/src/NzbDrone.Core/MediaFiles/MediaInfo/MediaInfoFormatter.cs index 7a7f893c0..b1374d581 100644 --- a/src/NzbDrone.Core/MediaFiles/MediaInfo/MediaInfoFormatter.cs +++ b/src/NzbDrone.Core/MediaFiles/MediaInfo/MediaInfoFormatter.cs @@ -461,15 +461,37 @@ namespace NzbDrone.Core.MediaFiles.MediaInfo if (audioChannelPositions.Contains("/")) { - return Regex.Replace(audioChannelPositions, + var channelStringList = Regex.Replace(audioChannelPositions, @"^\d+\sobjects", "", RegexOptions.Compiled | RegexOptions.IgnoreCase) .Replace("Object Based / ", "") .Split(new string[] { " / " }, StringSplitOptions.RemoveEmptyEntries) .FirstOrDefault() - ?.Split('/') - .Sum(s => decimal.Parse(s, CultureInfo.InvariantCulture)); + ?.Split('/'); + + var positions = default(decimal); + + if (channelStringList == null) + { + return 0; + } + + foreach (var channel in channelStringList) + { + var channelSplit = channel.Split(new string[] { "." }, StringSplitOptions.None); + + if (channelSplit.Count() == 3) + { + positions += decimal.Parse(string.Format("{0}.{1}", channelSplit[1], channelSplit[2])); + } + else + { + positions += decimal.Parse(channel); + } + } + + return positions; } } catch (Exception)