aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTayfun Akgüç <dev.akguc@gmail.com>2026-05-18 21:22:20 +0300
committerGitHub <noreply@github.com>2026-05-18 20:22:20 +0200
commit8deb5c1d2ac59befa100326eac57b099acfe4e8e (patch)
tree9089d9e3949dc708ab2a1552d57d7de17a79608e
parent077ad5c574423d9e712d69260cb5cb806ad12d77 (diff)
fix: write livetv recording NFO dateadded as UTC (#16863)
fix: write livetv recording NFO dateadded as UTC
-rw-r--r--src/Jellyfin.LiveTv/Recordings/RecordingsMetadataManager.cs2
-rw-r--r--tests/Jellyfin.LiveTv.Tests/Recordings/RecordingsMetadataManagerTests.cs64
2 files changed, 65 insertions, 1 deletions
diff --git a/src/Jellyfin.LiveTv/Recordings/RecordingsMetadataManager.cs b/src/Jellyfin.LiveTv/Recordings/RecordingsMetadataManager.cs
index 3a2c463695..7e68dbb547 100644
--- a/src/Jellyfin.LiveTv/Recordings/RecordingsMetadataManager.cs
+++ b/src/Jellyfin.LiveTv/Recordings/RecordingsMetadataManager.cs
@@ -288,7 +288,7 @@ public class RecordingsMetadataManager
null,
"dateadded",
null,
- DateTime.Now.ToString(DateAddedFormat, CultureInfo.InvariantCulture)).ConfigureAwait(false);
+ DateTime.UtcNow.ToString(DateAddedFormat, CultureInfo.InvariantCulture)).ConfigureAwait(false);
if (item.ProductionYear.HasValue)
{
diff --git a/tests/Jellyfin.LiveTv.Tests/Recordings/RecordingsMetadataManagerTests.cs b/tests/Jellyfin.LiveTv.Tests/Recordings/RecordingsMetadataManagerTests.cs
new file mode 100644
index 0000000000..14ce470fb4
--- /dev/null
+++ b/tests/Jellyfin.LiveTv.Tests/Recordings/RecordingsMetadataManagerTests.cs
@@ -0,0 +1,64 @@
+using System;
+using System.Globalization;
+using System.IO;
+using System.Threading.Tasks;
+using System.Xml;
+using Jellyfin.Extensions;
+using Jellyfin.LiveTv.Recordings;
+using MediaBrowser.Common.Configuration;
+using MediaBrowser.Controller.Entities;
+using MediaBrowser.Controller.Library;
+using MediaBrowser.Controller.LiveTv;
+using MediaBrowser.Model.Configuration;
+using MediaBrowser.Model.LiveTv;
+using Microsoft.Extensions.Logging.Abstractions;
+using Moq;
+using Xunit;
+
+namespace Jellyfin.LiveTv.Tests.Recordings;
+
+public sealed class RecordingsMetadataManagerTests
+{
+ private readonly string _tempDir =
+ Path.Combine(Path.GetTempPath(), "jellyfin-test-" + Guid.NewGuid());
+
+ [Fact]
+ public async Task SaveRecordingMetadata_DateAddedIsUtc()
+ {
+ Directory.CreateDirectory(_tempDir);
+ var recordingPath = Path.Combine(_tempDir, "test-recording.ts");
+ FileHelper.CreateEmpty(recordingPath);
+
+ var config = new Mock<IConfigurationManager>();
+ config.Setup(c => c.GetConfiguration("livetv"))
+ .Returns(new LiveTvOptions { SaveRecordingNFO = true, SaveRecordingImages = false });
+ config.Setup(c => c.GetConfiguration("xbmcmetadata"))
+ .Returns(new XbmcMetadataOptions());
+
+ var libraryManager = new Mock<ILibraryManager>();
+ libraryManager
+ .Setup(l => l.GetItemList(It.IsAny<InternalItemsQuery>()))
+ .Returns(Array.Empty<BaseItem>());
+
+ var manager = new RecordingsMetadataManager(
+ NullLogger<RecordingsMetadataManager>.Instance,
+ config.Object,
+ libraryManager.Object);
+
+ var timer = new TimerInfo { Name = "Test Recording", ProgramId = null };
+
+ var beforeUtc = DateTime.UtcNow.AddSeconds(-2);
+ await manager.SaveRecordingMetadata(timer, recordingPath, null);
+ var afterUtc = DateTime.UtcNow.AddSeconds(2);
+
+ var doc = new XmlDocument();
+ doc.Load(Path.ChangeExtension(recordingPath, ".nfo"));
+ var dateAddedText = doc.SelectSingleNode("//dateadded")?.InnerText ?? string.Empty;
+ var parsed = DateTime.ParseExact(
+ dateAddedText,
+ "yyyy-MM-dd HH:mm:ss",
+ CultureInfo.InvariantCulture);
+
+ Assert.InRange(parsed, beforeUtc, afterUtc);
+ }
+}