From 2da4a2d7539547b80f20b48210e16ce920927daa Mon Sep 17 00:00:00 2001 From: Marc Brooks Date: Sat, 1 Mar 2025 07:53:12 -0600 Subject: [PATCH] Fix overwrite of PremierDate with a year-only value (#13598) * Preserve the more-specific PremierDate's month and day Fixes #13596 --- .../Manager/MetadataService.cs | 4 +++- .../Manager/MetadataServiceTests.cs | 16 +++++++++++++--- 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/MediaBrowser.Providers/Manager/MetadataService.cs b/MediaBrowser.Providers/Manager/MetadataService.cs index 7203bf1158..751eb932f1 100644 --- a/MediaBrowser.Providers/Manager/MetadataService.cs +++ b/MediaBrowser.Providers/Manager/MetadataService.cs @@ -1010,7 +1010,7 @@ namespace MediaBrowser.Providers.Manager } } - if (replaceData || !target.PremiereDate.HasValue) + if (replaceData || !target.PremiereDate.HasValue || (IsYearOnlyDate(target.PremiereDate.Value) && source.PremiereDate.HasValue)) { target.PremiereDate = source.PremiereDate; } @@ -1142,6 +1142,8 @@ namespace MediaBrowser.Providers.Manager } } + private static bool IsYearOnlyDate(DateTime date) => date.Month == 1 && date.Day == 1; + private static void MergePeople(List source, List target) { if (target is null) diff --git a/tests/Jellyfin.Providers.Tests/Manager/MetadataServiceTests.cs b/tests/Jellyfin.Providers.Tests/Manager/MetadataServiceTests.cs index cedcaf9c0f..0beff125cd 100644 --- a/tests/Jellyfin.Providers.Tests/Manager/MetadataServiceTests.cs +++ b/tests/Jellyfin.Providers.Tests/Manager/MetadataServiceTests.cs @@ -141,8 +141,10 @@ namespace Jellyfin.Providers.Tests.Manager { "ProductionYear", 1, 2 }, { "CommunityRating", 1.0f, 2.0f }, { "CriticRating", 1.0f, 2.0f }, - { "EndDate", DateTime.UnixEpoch, DateTime.Now }, - { "PremiereDate", DateTime.UnixEpoch, DateTime.Now }, + { "EndDate", DateTime.UnixEpoch, DateTime.UtcNow }, + { "PremiereDate", DateTime.UnixEpoch, DateTime.UtcNow }, + { "PremiereDate", new DateTime(1999, 1, 1, 0, 0, 0, DateTimeKind.Utc), DateTime.UtcNow }, + { "PremiereDate", new DateTime(2025, 2, 21, 0, 0, 0, DateTimeKind.Utc), DateTime.UtcNow }, { "Video3DFormat", Video3DFormat.HalfSideBySide, Video3DFormat.FullSideBySide } }; @@ -151,7 +153,15 @@ namespace Jellyfin.Providers.Tests.Manager public void MergeBaseItemData_SimpleField_ReplacesAppropriately(string propName, object oldValue, object newValue) { // Use type Movie to allow testing of Video3DFormat - Assert.False(TestMergeBaseItemData(propName, oldValue, newValue, null, false, out _)); + if (propName.Equals("PremiereDate", StringComparison.Ordinal) && oldValue is DateTime oldDateTime) + { + bool expectReplaced = oldDateTime.Month == 1 && oldDateTime.Day == 1; + Assert.Equal(TestMergeBaseItemData(propName, oldValue, newValue, null, false, out _), expectReplaced); + } + else + { + Assert.False(TestMergeBaseItemData(propName, oldValue, newValue, null, false, out _)); + } Assert.True(TestMergeBaseItemData(propName, oldValue, newValue, null, true, out _)); Assert.True(TestMergeBaseItemData(propName, null, newValue, null, false, out _));