From b09a41ad1f05664a6099734cb44e068f993a8e93 Mon Sep 17 00:00:00 2001 From: JPVenson <6794763+JPVenson@users.noreply.github.com> Date: Wed, 9 Oct 2024 10:36:08 +0000 Subject: WIP porting new Repository structure --- MediaBrowser.Providers/Manager/MetadataService.cs | 25 +++++++++-------------- 1 file changed, 10 insertions(+), 15 deletions(-) (limited to 'MediaBrowser.Providers/Manager/MetadataService.cs') diff --git a/MediaBrowser.Providers/Manager/MetadataService.cs b/MediaBrowser.Providers/Manager/MetadataService.cs index 7203bf115..4c9d162c4 100644 --- a/MediaBrowser.Providers/Manager/MetadataService.cs +++ b/MediaBrowser.Providers/Manager/MetadataService.cs @@ -322,17 +322,17 @@ namespace MediaBrowser.Providers.Manager return false; } - protected virtual IList GetChildrenForMetadataUpdates(TItemType item) + protected virtual IReadOnlyList GetChildrenForMetadataUpdates(TItemType item) { if (item is Folder folder) { return folder.GetRecursiveChildren(); } - return Array.Empty(); + return []; } - protected virtual ItemUpdateType UpdateMetadataFromChildren(TItemType item, IList children, bool isFullRefresh, ItemUpdateType currentUpdateType) + protected virtual ItemUpdateType UpdateMetadataFromChildren(TItemType item, IReadOnlyList children, bool isFullRefresh, ItemUpdateType currentUpdateType) { var updateType = ItemUpdateType.None; @@ -371,7 +371,7 @@ namespace MediaBrowser.Providers.Manager return updateType; } - private ItemUpdateType UpdateCumulativeRunTimeTicks(TItemType item, IList children) + private ItemUpdateType UpdateCumulativeRunTimeTicks(TItemType item, IReadOnlyList children) { if (item is Folder folder && folder.SupportsCumulativeRunTimeTicks) { @@ -395,7 +395,7 @@ namespace MediaBrowser.Providers.Manager return ItemUpdateType.None; } - private ItemUpdateType UpdateDateLastMediaAdded(TItemType item, IList children) + private ItemUpdateType UpdateDateLastMediaAdded(TItemType item, IReadOnlyList children) { var updateType = ItemUpdateType.None; @@ -429,7 +429,7 @@ namespace MediaBrowser.Providers.Manager return updateType; } - private ItemUpdateType UpdatePremiereDate(TItemType item, IList children) + private ItemUpdateType UpdatePremiereDate(TItemType item, IReadOnlyList children) { var updateType = ItemUpdateType.None; @@ -467,7 +467,7 @@ namespace MediaBrowser.Providers.Manager return updateType; } - private ItemUpdateType UpdateGenres(TItemType item, IList children) + private ItemUpdateType UpdateGenres(TItemType item, IReadOnlyList children) { var updateType = ItemUpdateType.None; @@ -488,7 +488,7 @@ namespace MediaBrowser.Providers.Manager return updateType; } - private ItemUpdateType UpdateStudios(TItemType item, IList children) + private ItemUpdateType UpdateStudios(TItemType item, IReadOnlyList children) { var updateType = ItemUpdateType.None; @@ -509,7 +509,7 @@ namespace MediaBrowser.Providers.Manager return updateType; } - private ItemUpdateType UpdateOfficialRating(TItemType item, IList children) + private ItemUpdateType UpdateOfficialRating(TItemType item, IReadOnlyList children) { var updateType = ItemUpdateType.None; @@ -1142,13 +1142,8 @@ namespace MediaBrowser.Providers.Manager } } - private static void MergePeople(List source, List target) + private static void MergePeople(IReadOnlyList source, IReadOnlyList target) { - if (target is null) - { - target = new List(); - } - foreach (var person in target) { var normalizedName = person.Name.RemoveDiacritics(); -- cgit v1.2.3 From 5167333602ec339ba6d3b5453dce16d200fe79db Mon Sep 17 00:00:00 2001 From: JPVenson Date: Thu, 14 Nov 2024 14:07:36 +0000 Subject: Fixed base items not saved before Metadata --- MediaBrowser.Providers/Manager/MetadataService.cs | 64 ++++++++++------------- 1 file changed, 29 insertions(+), 35 deletions(-) (limited to 'MediaBrowser.Providers/Manager/MetadataService.cs') diff --git a/MediaBrowser.Providers/Manager/MetadataService.cs b/MediaBrowser.Providers/Manager/MetadataService.cs index 4c9d162c4..afa3fd206 100644 --- a/MediaBrowser.Providers/Manager/MetadataService.cs +++ b/MediaBrowser.Providers/Manager/MetadataService.cs @@ -74,10 +74,11 @@ namespace MediaBrowser.Providers.Manager public virtual async Task RefreshMetadata(BaseItem item, MetadataRefreshOptions refreshOptions, CancellationToken cancellationToken) { var itemOfType = (TItemType)item; - var updateType = ItemUpdateType.None; - var libraryOptions = LibraryManager.GetLibraryOptions(item); + var isFirstRefresh = item.DateLastRefreshed == default; + var hasRefreshedMetadata = true; + var hasRefreshedImages = true; var requiresRefresh = libraryOptions.AutomaticRefreshIntervalDays > 0 && (DateTime.UtcNow - item.DateLastRefreshed).TotalDays >= libraryOptions.AutomaticRefreshIntervalDays; @@ -131,9 +132,30 @@ namespace MediaBrowser.Providers.Manager People = LibraryManager.GetPeople(item) }; - bool hasRefreshedMetadata = true; - bool hasRefreshedImages = true; - var isFirstRefresh = item.DateLastRefreshed == default; + var beforeSaveResult = BeforeSave(itemOfType, isFirstRefresh || refreshOptions.ReplaceAllMetadata || refreshOptions.MetadataRefreshMode == MetadataRefreshMode.FullRefresh || requiresRefresh || refreshOptions.ForceSave, updateType); + updateType |= beforeSaveResult; + + // Save if changes were made, or it's never been saved before + if (refreshOptions.ForceSave || updateType > ItemUpdateType.None || isFirstRefresh || refreshOptions.ReplaceAllMetadata || requiresRefresh) + { + if (item.IsFileProtocol) + { + var file = TryGetFile(item.Path, refreshOptions.DirectoryService); + if (file is not null) + { + item.DateModified = file.LastWriteTimeUtc; + } + } + + // If any of these properties are set then make sure the updateType is not None, just to force everything to save + if (refreshOptions.ForceSave || refreshOptions.ReplaceAllMetadata) + { + updateType |= ItemUpdateType.MetadataDownload; + } + + // Save to database + await SaveItemAsync(metadataResult, updateType, cancellationToken).ConfigureAwait(false); + } // Next run metadata providers if (refreshOptions.MetadataRefreshMode != MetadataRefreshMode.None) @@ -188,37 +210,9 @@ namespace MediaBrowser.Providers.Manager } } - var beforeSaveResult = BeforeSave(itemOfType, isFirstRefresh || refreshOptions.ReplaceAllMetadata || refreshOptions.MetadataRefreshMode == MetadataRefreshMode.FullRefresh || requiresRefresh || refreshOptions.ForceSave, updateType); - updateType |= beforeSaveResult; - - // Save if changes were made, or it's never been saved before - if (refreshOptions.ForceSave || updateType > ItemUpdateType.None || isFirstRefresh || refreshOptions.ReplaceAllMetadata || requiresRefresh) + if (hasRefreshedMetadata && hasRefreshedImages) { - if (item.IsFileProtocol) - { - var file = TryGetFile(item.Path, refreshOptions.DirectoryService); - if (file is not null) - { - item.DateModified = file.LastWriteTimeUtc; - } - } - - // If any of these properties are set then make sure the updateType is not None, just to force everything to save - if (refreshOptions.ForceSave || refreshOptions.ReplaceAllMetadata) - { - updateType |= ItemUpdateType.MetadataDownload; - } - - if (hasRefreshedMetadata && hasRefreshedImages) - { - item.DateLastRefreshed = DateTime.UtcNow; - } - else - { - item.DateLastRefreshed = default; - } - - // Save to database + item.DateLastRefreshed = DateTime.UtcNow; await SaveItemAsync(metadataResult, updateType, cancellationToken).ConfigureAwait(false); } -- cgit v1.2.3 From 9f7f9cc0fffb2ada50feecc060f3ba069fcca7f2 Mon Sep 17 00:00:00 2001 From: JPVenson Date: Sat, 16 Nov 2024 20:30:43 +0000 Subject: Fixed metadata refresh not working --- .../Item/BaseItemRepository.cs | 4 +- MediaBrowser.Providers/Manager/MetadataService.cs | 52 +++++++++++++--------- 2 files changed, 32 insertions(+), 24 deletions(-) (limited to 'MediaBrowser.Providers/Manager/MetadataService.cs') diff --git a/Jellyfin.Server.Implementations/Item/BaseItemRepository.cs b/Jellyfin.Server.Implementations/Item/BaseItemRepository.cs index ba86f5fbd..aa959318c 100644 --- a/Jellyfin.Server.Implementations/Item/BaseItemRepository.cs +++ b/Jellyfin.Server.Implementations/Item/BaseItemRepository.cs @@ -209,7 +209,7 @@ public sealed class BaseItemRepository( result.TotalRecordCount = dbQuery.Count(); } - dbQuery = ApplyOrder(dbQuery, filter); + dbQuery = ApplyGroupingFilter(dbQuery, filter); dbQuery = ApplyQueryPageing(dbQuery, filter); result.Items = dbQuery.AsEnumerable().Where(e => e is not null).Select(w => DeserialiseBaseItem(w, filter.SkipDeserialization)).ToImmutableArray(); @@ -228,7 +228,6 @@ public sealed class BaseItemRepository( dbQuery = TranslateQuery(dbQuery, context, filter); // dbQuery = dbQuery.Distinct(); - dbQuery = ApplyOrder(dbQuery, filter); dbQuery = ApplyGroupingFilter(dbQuery, filter); dbQuery = ApplyQueryPageing(dbQuery, filter); @@ -253,6 +252,7 @@ public sealed class BaseItemRepository( else { dbQuery = dbQuery.Distinct(); + dbQuery = ApplyOrder(dbQuery, filter); } return dbQuery; diff --git a/MediaBrowser.Providers/Manager/MetadataService.cs b/MediaBrowser.Providers/Manager/MetadataService.cs index afa3fd206..778fbc712 100644 --- a/MediaBrowser.Providers/Manager/MetadataService.cs +++ b/MediaBrowser.Providers/Manager/MetadataService.cs @@ -135,27 +135,7 @@ namespace MediaBrowser.Providers.Manager var beforeSaveResult = BeforeSave(itemOfType, isFirstRefresh || refreshOptions.ReplaceAllMetadata || refreshOptions.MetadataRefreshMode == MetadataRefreshMode.FullRefresh || requiresRefresh || refreshOptions.ForceSave, updateType); updateType |= beforeSaveResult; - // Save if changes were made, or it's never been saved before - if (refreshOptions.ForceSave || updateType > ItemUpdateType.None || isFirstRefresh || refreshOptions.ReplaceAllMetadata || requiresRefresh) - { - if (item.IsFileProtocol) - { - var file = TryGetFile(item.Path, refreshOptions.DirectoryService); - if (file is not null) - { - item.DateModified = file.LastWriteTimeUtc; - } - } - - // If any of these properties are set then make sure the updateType is not None, just to force everything to save - if (refreshOptions.ForceSave || refreshOptions.ReplaceAllMetadata) - { - updateType |= ItemUpdateType.MetadataDownload; - } - - // Save to database - await SaveItemAsync(metadataResult, updateType, cancellationToken).ConfigureAwait(false); - } + updateType = await SaveInternal(item, refreshOptions, updateType, isFirstRefresh, requiresRefresh, metadataResult, cancellationToken).ConfigureAwait(false); // Next run metadata providers if (refreshOptions.MetadataRefreshMode != MetadataRefreshMode.None) @@ -213,12 +193,40 @@ namespace MediaBrowser.Providers.Manager if (hasRefreshedMetadata && hasRefreshedImages) { item.DateLastRefreshed = DateTime.UtcNow; - await SaveItemAsync(metadataResult, updateType, cancellationToken).ConfigureAwait(false); } + updateType = await SaveInternal(item, refreshOptions, updateType, isFirstRefresh, requiresRefresh, metadataResult, cancellationToken).ConfigureAwait(false); + await AfterMetadataRefresh(itemOfType, refreshOptions, cancellationToken).ConfigureAwait(false); return updateType; + + async Task SaveInternal(BaseItem item, MetadataRefreshOptions refreshOptions, ItemUpdateType updateType, bool isFirstRefresh, bool requiresRefresh, MetadataResult metadataResult, CancellationToken cancellationToken) + { + // Save if changes were made, or it's never been saved before + if (refreshOptions.ForceSave || updateType > ItemUpdateType.None || isFirstRefresh || refreshOptions.ReplaceAllMetadata || requiresRefresh) + { + if (item.IsFileProtocol) + { + var file = TryGetFile(item.Path, refreshOptions.DirectoryService); + if (file is not null) + { + item.DateModified = file.LastWriteTimeUtc; + } + } + + // If any of these properties are set then make sure the updateType is not None, just to force everything to save + if (refreshOptions.ForceSave || refreshOptions.ReplaceAllMetadata) + { + updateType |= ItemUpdateType.MetadataDownload; + } + + // Save to database + await SaveItemAsync(metadataResult, updateType, cancellationToken).ConfigureAwait(false); + } + + return updateType; + } } private void ApplySearchResult(ItemLookupInfo lookupInfo, RemoteSearchResult result) -- cgit v1.2.3