From 479bae8a6a3dcb8fdbb441ebf004cba64e5a9120 Mon Sep 17 00:00:00 2001 From: Jamie Rees Date: Tue, 1 May 2018 14:21:27 +0100 Subject: [PATCH] Made the episode list in the newsletter easier to read. Rather than 1,2,3,4,5,10 we will now show 1-5, 10 --- src/Ombi.Schedule.Tests/NewsletterTests.cs | 43 +++++++++++ .../Ombi.Schedule.Tests.csproj | 8 +- src/Ombi.Schedule/Jobs/Ombi/NewsletterJob.cs | 77 +++++++++++-------- 3 files changed, 94 insertions(+), 34 deletions(-) create mode 100644 src/Ombi.Schedule.Tests/NewsletterTests.cs diff --git a/src/Ombi.Schedule.Tests/NewsletterTests.cs b/src/Ombi.Schedule.Tests/NewsletterTests.cs new file mode 100644 index 000000000..fcbd35107 --- /dev/null +++ b/src/Ombi.Schedule.Tests/NewsletterTests.cs @@ -0,0 +1,43 @@ +using System.Collections.Generic; +using Moq; +using NUnit.Framework; +using Ombi.Core.Settings; +using Ombi.Schedule.Jobs.Ombi; +using Ombi.Settings.Settings.Models; +using Ombi.Settings.Settings.Models.Notifications; +using Ombi.Store.Entities; + +namespace Ombi.Schedule.Tests +{ + [TestFixture] + public class NewsletterTests + { + [TestCaseSource(nameof(EpisodeListData))] + public string BuildEpisodeListTest(List episodes) + { + var emailSettings = new Mock>(); + var customziation = new Mock>(); + var newsletterSettings = new Mock>(); + var newsletter = new NewsletterJob(null, null, null, null, null, null, customziation.Object, emailSettings.Object, null, null, newsletterSettings.Object, null); + + var ep = new List(); + foreach (var i in episodes) + { + ep.Add(i); + } + var result = newsletter.BuildEpisodeList(ep); + return result; + } + + public static IEnumerable EpisodeListData + { + get + { + yield return new TestCaseData(new List{1,2,3,4,5,6}).Returns("1-6").SetName("Simple 1-6"); + yield return new TestCaseData(new List{1,2,3,4,5,6,8,9}).Returns("1-6, 8-9").SetName("Simple 1-6, 8-9"); + yield return new TestCaseData(new List{1,99,101,555,468,469}).Returns("1, 99, 101, 555, 468-469").SetName("More Complex"); + yield return new TestCaseData(new List{1}).Returns("1").SetName("Single Episode"); + } + } + } +} \ No newline at end of file diff --git a/src/Ombi.Schedule.Tests/Ombi.Schedule.Tests.csproj b/src/Ombi.Schedule.Tests/Ombi.Schedule.Tests.csproj index eae150067..1805b80f2 100644 --- a/src/Ombi.Schedule.Tests/Ombi.Schedule.Tests.csproj +++ b/src/Ombi.Schedule.Tests/Ombi.Schedule.Tests.csproj @@ -8,10 +8,10 @@ - - - - + + + + diff --git a/src/Ombi.Schedule/Jobs/Ombi/NewsletterJob.cs b/src/Ombi.Schedule/Jobs/Ombi/NewsletterJob.cs index 1a4d00473..56e3f25c7 100644 --- a/src/Ombi.Schedule/Jobs/Ombi/NewsletterJob.cs +++ b/src/Ombi.Schedule/Jobs/Ombi/NewsletterJob.cs @@ -557,21 +557,8 @@ namespace Ombi.Schedule.Jobs.Ombi foreach (var epInformation in results.OrderBy(x => x.SeasonNumber)) { var orderedEpisodes = epInformation.Episodes.OrderBy(x => x.EpisodeNumber).ToList(); - var epSb = new StringBuilder(); - for (var i = 0; i < orderedEpisodes.Count; i++) - { - var ep = orderedEpisodes[i]; - if (i < orderedEpisodes.Count - 1) - { - epSb.Append($"{ep.EpisodeNumber},"); - } - else - { - epSb.Append($"{ep.EpisodeNumber}"); - } - - } - finalsb.Append($"Season: {epInformation.SeasonNumber} - Episodes: {epSb}"); + var episodeString = BuildEpisodeList(orderedEpisodes.Select(x => x.EpisodeNumber)); + finalsb.Append($"Season: {epInformation.SeasonNumber} - Episodes: {episodeString}"); finalsb.Append("
"); } @@ -608,6 +595,49 @@ namespace Ombi.Schedule.Jobs.Ombi } } + public string BuildEpisodeList(IEnumerable orderedEpisodes) + { + var epSb = new StringBuilder(); + var previousEpisodes = new List(); + var previousEpisode = -1; + foreach (var ep in orderedEpisodes) + { + if (ep - 1 == previousEpisode) + { + // This is the next one + previousEpisodes.Add(ep); + } + else + { + if (previousEpisodes.Count > 1) + { + // End it + epSb.Append($"{previousEpisodes.First()}-{previousEpisodes.Last()}, "); + } + else if (previousEpisodes.Count == 1) + { + epSb.Append($"{previousEpisodes.FirstOrDefault()}, "); + } + // New one + previousEpisodes.Clear(); + previousEpisodes.Add(ep); + } + previousEpisode = ep; + } + + if (previousEpisodes.Count > 1) + { + // Got some left over + epSb.Append($"{previousEpisodes.First()}-{previousEpisodes.Last()}"); + } + else if(previousEpisodes.Count == 1) + { + epSb.Append(previousEpisodes.FirstOrDefault()); + } + + return epSb.ToString(); + } + private async Task ProcessEmbyTv(HashSet embyContent, StringBuilder sb) { var series = new List(); @@ -681,21 +711,8 @@ namespace Ombi.Schedule.Jobs.Ombi foreach (var epInformation in results.OrderBy(x => x.SeasonNumber)) { var orderedEpisodes = epInformation.Episodes.OrderBy(x => x.EpisodeNumber).ToList(); - var epSb = new StringBuilder(); - for (var i = 0; i < orderedEpisodes.Count; i++) - { - var ep = orderedEpisodes[i]; - if (i < orderedEpisodes.Count - 1) - { - epSb.Append($"{ep.EpisodeNumber},"); - } - else - { - epSb.Append($"{ep.EpisodeNumber}"); - } - - } - finalsb.Append($"Season: {epInformation.SeasonNumber} - Episodes: {epSb}"); + var episodeString = BuildEpisodeList(orderedEpisodes.Select(x => x.EpisodeNumber)); + finalsb.Append($"Season: {epInformation.SeasonNumber} - Episodes: {episodeString}"); finalsb.Append("
"); }