diff options
| author | Shadowghost <Ghost_of_Stone@web.de> | 2026-07-25 17:17:30 +0200 |
|---|---|---|
| committer | Shadowghost <Ghost_of_Stone@web.de> | 2026-07-25 17:17:30 +0200 |
| commit | 3c9727d36cdf6749106ad398835484810d0c6a22 (patch) | |
| tree | 957daad77089f41da653c31f84415ba258447c92 /MediaBrowser.Controller | |
| parent | 6382563440b69d816639abc2b4d03fca1d35eca2 (diff) | |
Always inherit from owner item and add tests
Diffstat (limited to 'MediaBrowser.Controller')
| -rw-r--r-- | MediaBrowser.Controller/Entities/BaseItem.cs | 59 |
1 files changed, 45 insertions, 14 deletions
diff --git a/MediaBrowser.Controller/Entities/BaseItem.cs b/MediaBrowser.Controller/Entities/BaseItem.cs index 41f7e796e8..cc3cba41c2 100644 --- a/MediaBrowser.Controller/Entities/BaseItem.cs +++ b/MediaBrowser.Controller/Entities/BaseItem.cs @@ -1533,15 +1533,27 @@ namespace MediaBrowser.Controller.Entities var extras = LibraryManager.FindExtras(item, fileSystemChildren, options.DirectoryService).ToArray(); var newExtraIds = Array.ConvertAll(extras, x => x.Id); - var currentExtraIds = LibraryManager.GetItemList(new InternalItemsQuery() + var currentExtras = LibraryManager.GetItemList(new InternalItemsQuery() { OwnerIds = [item.Id] - }).Select(e => e.Id).ToArray(); + }); + + var currentExtraIds = currentExtras.Select(e => e.Id).ToArray(); var extrasChanged = !currentExtraIds.OrderBy(x => x).SequenceEqual(newExtraIds.OrderBy(x => x)); if (!extrasChanged && !options.ReplaceAllMetadata && options.MetadataRefreshMode != MetadataRefreshMode.FullRefresh) { + // The owner's dates may only have become known after its extras were created, so keep + // them in sync even when there is nothing to refresh. + foreach (var extra in currentExtras) + { + if (extra.ExtraType is not null && InheritDatesFromOwner(item, extra)) + { + await extra.UpdateToRepositoryAsync(ItemUpdateType.MetadataEdit, cancellationToken).ConfigureAwait(false); + } + } + return false; } @@ -1558,18 +1570,6 @@ namespace MediaBrowser.Controller.Entities i.OwnerId = ownerId; i.ParentId = Guid.Empty; - // Extras (e.g. trailers) frequently have no reliable date metadata of their own and - // would otherwise fall back to the file's container creation date. Inherit the owner's - // year/premiere date when the extra doesn't have one, so it stays consistent with the - // media it belongs to. Setting it before the refresh means the media info provider - // won't overwrite it from the file creation date. - if (i.ProductionYear is null && item.ProductionYear is not null) - { - i.ProductionYear = item.ProductionYear; - i.PremiereDate ??= item.PremiereDate; - subOptions.ForceSave = true; - } - return RefreshMetadataForOwnedItem(i, true, subOptions, cancellationToken); }); @@ -2652,6 +2652,32 @@ namespace MediaBrowser.Controller.Entities } } + /// <summary> + /// Applies the owner's premiere date and production year to an owned item, returning whether anything changed. + /// </summary> + /// <param name="owner">The owner.</param> + /// <param name="ownedItem">The owned item.</param> + /// <returns><c>true</c> if the owned item was changed, else <c>false</c>.</returns> + internal static bool InheritDatesFromOwner(BaseItem owner, BaseItem ownedItem) + { + // Extras have no release date of their own, so the owner's is authoritative. + var changed = false; + + if (owner.ProductionYear is not null && ownedItem.ProductionYear != owner.ProductionYear) + { + ownedItem.ProductionYear = owner.ProductionYear; + changed = true; + } + + if (owner.PremiereDate is not null && ownedItem.PremiereDate != owner.PremiereDate) + { + ownedItem.PremiereDate = owner.PremiereDate; + changed = true; + } + + return changed; + } + protected async Task RefreshMetadataForOwnedItem(BaseItem ownedItem, bool copyTitleMetadata, MetadataRefreshOptions options, CancellationToken cancellationToken) { var newOptions = new MetadataRefreshOptions(options) @@ -2711,6 +2737,11 @@ namespace MediaBrowser.Controller.Entities ownedItem.CustomRating = item.CustomRating; newOptions.ForceSave = true; } + + if (InheritDatesFromOwner(item, ownedItem)) + { + newOptions.ForceSave = true; + } } await ownedItem.RefreshMetadata(newOptions, cancellationToken).ConfigureAwait(false); |
