From e0cef629692cfb22fcea2487b16d3f199ea3f41b Mon Sep 17 00:00:00 2001 From: Jason Dove <1695733+jasongdove@users.noreply.github.com> Date: Fri, 18 Jul 2025 17:14:11 +0000 Subject: [PATCH] fix block playout epg time zone (#2166) --- CHANGELOG.md | 1 + .../Channels/Commands/RefreshChannelDataHandler.cs | 13 +++++++++++-- .../Scheduling/MultiPartEpisodeGrouperTests.cs | 4 +++- 3 files changed, 15 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c17e0d0e5..9cd15c4a4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -138,6 +138,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). - Fix VAAPI tonemap failure - Fix green bars after VAAPI tonemap - Fix bug where playout mode `Multiple` would ignore fixed start time +- Fix block playout EPG generation to use XMLTV Time Zone setting ## [25.2.0] - 2025-06-24 ### Added diff --git a/ErsatzTV.Application/Channels/Commands/RefreshChannelDataHandler.cs b/ErsatzTV.Application/Channels/Commands/RefreshChannelDataHandler.cs index 463f7517b..f4813b27c 100644 --- a/ErsatzTV.Application/Channels/Commands/RefreshChannelDataHandler.cs +++ b/ErsatzTV.Application/Channels/Commands/RefreshChannelDataHandler.cs @@ -346,7 +346,7 @@ public class RefreshChannelDataHandler : IRequestHandler } } - private static async Task WriteBlockPlayoutXml( + private async Task WriteBlockPlayoutXml( RefreshChannelData request, List sorted, XmlTemplateContext templateContext, @@ -358,6 +358,10 @@ public class RefreshChannelDataHandler : IRequestHandler XmlMinifier minifier, XmlWriter xml) { + XmltvTimeZone xmltvTimeZone = await _configElementRepository + .GetValue(ConfigElementKey.XmltvTimeZone) + .IfNoneAsync(XmltvTimeZone.Local); + var groups = sorted.GroupBy(s => new { s.GuideStart, s.GuideFinish, s.GuideGroup }); foreach (var group in groups) { @@ -373,7 +377,12 @@ public class RefreshChannelDataHandler : IRequestHandler TimeSpan perItem = groupDuration / itemsToInclude.Count; - DateTimeOffset currentStart = new DateTimeOffset(groupStart, TimeSpan.Zero).ToLocalTime(); + DateTimeOffset currentStart = xmltvTimeZone switch + { + XmltvTimeZone.Utc => new DateTimeOffset(groupStart, TimeSpan.Zero), + _ => new DateTimeOffset(groupStart, TimeSpan.Zero).ToLocalTime() + }; + DateTimeOffset currentFinish = currentStart + perItem; foreach (PlayoutItem item in itemsToInclude) diff --git a/ErsatzTV.Core.Tests/Scheduling/MultiPartEpisodeGrouperTests.cs b/ErsatzTV.Core.Tests/Scheduling/MultiPartEpisodeGrouperTests.cs index da6809d89..b4c5be94b 100644 --- a/ErsatzTV.Core.Tests/Scheduling/MultiPartEpisodeGrouperTests.cs +++ b/ErsatzTV.Core.Tests/Scheduling/MultiPartEpisodeGrouperTests.cs @@ -57,7 +57,9 @@ public class MultiPartEpisodeGrouperTests [Test] [TestCase("The Meddlers (Part One)", "The Meddlers (Part Two)", "The Meddlers (Part Three)")] - [TestCase("S01E01 The Slaves of Jedikiah, Part 1", "S01E02 The Slaves of Jedikiah, Part 2", "S01E03 The Slaves of Jedikiah, Part 3")] + [TestCase("The Slaves of Jedikiah, Part 1", "The Slaves of Jedikiah, Part 2", "The Slaves of Jedikiah, Part 3")] + [TestCase("An Unearthly Child: An Unearthly Child (1)", "An Unearthly Child: The Cave of Skulls (2)", "An Unearthly Child: The Forest of Fear (3)")] + [TestCase("The Savages (1)", "The Savages (2)", "The Savages (3)")] public void All_Grouped(string one, string two, string three) { var mediaItems = new List