diff --git a/NzbDrone.Core.Test/FluentTest.cs b/NzbDrone.Core.Test/FluentTest.cs index 797bc5a4a..d6dd891bf 100644 --- a/NzbDrone.Core.Test/FluentTest.cs +++ b/NzbDrone.Core.Test/FluentTest.cs @@ -191,5 +191,33 @@ namespace NzbDrone.Core.Test //Resolve result.Should().Be(10); } + + [Test] + public void Truncate_should_truncate_strings_to_max_specified_number_of_bytes() + { + //Setup + var str = File.ReadAllText(@"Files\LongOverview.txt"); + + //Act + var resultString = str.Truncate(1000); + + //Resolve + var result = new System.Text.UTF8Encoding().GetBytes(resultString); + result.Length.Should().BeLessOrEqualTo(1000); + } + + [Test] + public void Truncate_should_not_truncate_string_shorter_than_max_bytes() + { + //Setup + var str = "Hello World"; + + //Act + var resultString = str.Truncate(1000); + + //Resolve + var result = new System.Text.UTF8Encoding().GetBytes(resultString); + result.Length.Should().Be(11); + } } } diff --git a/NzbDrone.Core.Test/ProviderTests/EpisodeProviderTest.cs b/NzbDrone.Core.Test/ProviderTests/EpisodeProviderTest.cs index a69cdcb2d..7798d6695 100644 --- a/NzbDrone.Core.Test/ProviderTests/EpisodeProviderTest.cs +++ b/NzbDrone.Core.Test/ProviderTests/EpisodeProviderTest.cs @@ -480,48 +480,6 @@ namespace NzbDrone.Core.Test.ProviderTests result.Where(e => e.Ignored).Should().HaveCount(episodeCount); } - [Test] - public void RefreshEpisodeInfo_should_trim_overview_to_4000_characters() - { - //Arrange - const int seriesId = 71663; - const int episodeCount = 10; - - var longOverview = File.ReadAllText(@".\Files\LongOverview.txt"); - - var fakeEpisodes = Builder.CreateNew().With( - c => c.Episodes = - new List(Builder.CreateListOfSize(episodeCount). - All() - .With(l => l.Language = new TvdbLanguage(0, "eng", "a")) - .With(e => e.SeasonNumber = 0) - .TheLast(1) - .With(e => e.Overview = longOverview) - .Build()) - ).With(c => c.Id = seriesId).Build(); - - var fakeSeries = Builder.CreateNew().With(c => c.SeriesId = seriesId).Build(); - - WithRealDb(); - - Db.Insert(fakeSeries); - - Mocker.GetMock() - .Setup(c => c.GetSeries(seriesId, true)) - .Returns(fakeEpisodes); - - Mocker.GetMock() - .Setup(s => s.IsIgnored(seriesId, 0)) - .Returns(false); - - //Act - Mocker.Resolve().RefreshEpisodeInfo(fakeSeries); - - //Assert - var result = Mocker.Resolve().GetEpisodeBySeries(seriesId).ToList(); - result.Should().HaveCount(episodeCount); - } - [Test] public void new_episodes_only_calls_Insert() { diff --git a/NzbDrone.Core/Fluent.cs b/NzbDrone.Core/Fluent.cs index f99c0d038..f27ec5b76 100644 --- a/NzbDrone.Core/Fluent.cs +++ b/NzbDrone.Core/Fluent.cs @@ -62,5 +62,30 @@ namespace NzbDrone.Core return intList.Max(); } + + public static string Truncate(this string s, int maxLength) + { + if (Encoding.UTF8.GetByteCount(s) <= maxLength) + return s; + var cs = s.ToCharArray(); + int length = 0; + int i = 0; + while (i < cs.Length) + { + int charSize = 1; + if (i < (cs.Length - 1) && char.IsSurrogate(cs[i])) + charSize = 2; + int byteSize = Encoding.UTF8.GetByteCount(cs, i, charSize); + if ((byteSize + length) <= maxLength) + { + i = i + charSize; + length += byteSize; + } + else + break; + } + return s.Substring(0, i); + } + } } diff --git a/NzbDrone.Core/Providers/EpisodeProvider.cs b/NzbDrone.Core/Providers/EpisodeProvider.cs index d3461d018..0f94666b1 100644 --- a/NzbDrone.Core/Providers/EpisodeProvider.cs +++ b/NzbDrone.Core/Providers/EpisodeProvider.cs @@ -328,10 +328,7 @@ namespace NzbDrone.Core.Providers episodeToUpdate.SeasonNumber = episode.SeasonNumber; episodeToUpdate.Title = episode.EpisodeName; - if (episode.Overview.Length > 3998) - episodeToUpdate.Overview = episode.Overview.Substring(0, 3998); - else - episodeToUpdate.Overview = episode.Overview; + episodeToUpdate.Overview = episode.Overview.Truncate(4000); if (episode.FirstAired.Year > 1900) episodeToUpdate.AirDate = episode.FirstAired.Date; diff --git a/NzbDrone.sln b/NzbDrone.sln index c142dae30..3f4b8776f 100644 --- a/NzbDrone.sln +++ b/NzbDrone.sln @@ -247,6 +247,7 @@ Global {C0EA1A40-91AD-4EEB-BD16-2DDDEBD20AE5}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU {C0EA1A40-91AD-4EEB-BD16-2DDDEBD20AE5}.Debug|x64.ActiveCfg = Debug|Any CPU {C0EA1A40-91AD-4EEB-BD16-2DDDEBD20AE5}.Debug|x86.ActiveCfg = Debug|Any CPU + {C0EA1A40-91AD-4EEB-BD16-2DDDEBD20AE5}.Debug|x86.Build.0 = Debug|Any CPU {C0EA1A40-91AD-4EEB-BD16-2DDDEBD20AE5}.Release|Any CPU.ActiveCfg = Release|Any CPU {C0EA1A40-91AD-4EEB-BD16-2DDDEBD20AE5}.Release|Any CPU.Build.0 = Release|Any CPU {C0EA1A40-91AD-4EEB-BD16-2DDDEBD20AE5}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU