From 09a1c31fa303856c8b9724df06f68eb5bb88ea05 Mon Sep 17 00:00:00 2001
From: MarcoCoreDuo <90222533+MarcoCoreDuo@users.noreply.github.com>
Date: Wed, 31 Dec 2025 03:06:07 +0100
Subject: [PATCH] Refactor ReattachUserData methods to be asynchronous
---
Emby.Server.Implementations/Library/LibraryManager.cs | 4 ++--
.../Item/BaseItemRepository.cs | 10 ++++++----
MediaBrowser.Controller/Entities/BaseItem.cs | 3 ++-
MediaBrowser.Controller/Library/ILibraryManager.cs | 3 ++-
MediaBrowser.Controller/Persistence/IItemRepository.cs | 3 ++-
MediaBrowser.Providers/Manager/MetadataService.cs | 2 +-
6 files changed, 15 insertions(+), 10 deletions(-)
diff --git a/Emby.Server.Implementations/Library/LibraryManager.cs b/Emby.Server.Implementations/Library/LibraryManager.cs
index 83b135f924..1716c49e59 100644
--- a/Emby.Server.Implementations/Library/LibraryManager.cs
+++ b/Emby.Server.Implementations/Library/LibraryManager.cs
@@ -2203,9 +2203,9 @@ namespace Emby.Server.Implementations.Library
=> UpdateItemsAsync([item], parent, updateReason, cancellationToken);
///
- public void ReattachUserData(BaseItem item, CancellationToken cancellationToken)
+ public async Task ReattachUserDataAsync(BaseItem item, CancellationToken cancellationToken)
{
- _itemRepository.ReattachUserData(item, cancellationToken);
+ await _itemRepository.ReattachUserDataAsync(item, cancellationToken).ConfigureAwait(false);
}
public async Task RunMetadataSavers(BaseItem item, ItemUpdateType updateReason)
diff --git a/Jellyfin.Server.Implementations/Item/BaseItemRepository.cs b/Jellyfin.Server.Implementations/Item/BaseItemRepository.cs
index f4c4cb731a..8191bd02e1 100644
--- a/Jellyfin.Server.Implementations/Item/BaseItemRepository.cs
+++ b/Jellyfin.Server.Implementations/Item/BaseItemRepository.cs
@@ -746,7 +746,7 @@ public sealed class BaseItemRepository
}
///
- public void ReattachUserData(BaseItemDto item, CancellationToken cancellationToken)
+ public async Task ReattachUserDataAsync(BaseItemDto item, CancellationToken cancellationToken)
{
ArgumentNullException.ThrowIfNull(item);
cancellationToken.ThrowIfCancellationRequested();
@@ -755,12 +755,14 @@ public sealed class BaseItemRepository
var userKeys = item.GetUserDataKeys().ToArray();
var retentionDate = (DateTime?)null;
- context.UserData
+ await context.UserData
.Where(e => e.ItemId == PlaceholderId)
.Where(e => userKeys.Contains(e.CustomDataKey))
- .ExecuteUpdate(e => e
+ .ExecuteUpdateAsync(
+ e => e
.SetProperty(f => f.ItemId, item.Id)
- .SetProperty(f => f.RetentionDate, retentionDate));
+ .SetProperty(f => f.RetentionDate, retentionDate),
+ cancellationToken).ConfigureAwait(false);
}
///
diff --git a/MediaBrowser.Controller/Entities/BaseItem.cs b/MediaBrowser.Controller/Entities/BaseItem.cs
index 4938b43e4b..7586b99e77 100644
--- a/MediaBrowser.Controller/Entities/BaseItem.cs
+++ b/MediaBrowser.Controller/Entities/BaseItem.cs
@@ -2053,7 +2053,8 @@ namespace MediaBrowser.Controller.Entities
public virtual async Task UpdateToRepositoryAsync(ItemUpdateType updateReason, CancellationToken cancellationToken)
=> await LibraryManager.UpdateItemAsync(this, GetParent(), updateReason, cancellationToken).ConfigureAwait(false);
- public void ReattachUserData(CancellationToken cancellationToken) => LibraryManager.ReattachUserData(this, cancellationToken);
+ public async Task ReattachUserDataAsync(CancellationToken cancellationToken) =>
+ await LibraryManager.ReattachUserDataAsync(this, cancellationToken).ConfigureAwait(false);
///
/// Validates that images within the item are still on the filesystem.
diff --git a/MediaBrowser.Controller/Library/ILibraryManager.cs b/MediaBrowser.Controller/Library/ILibraryManager.cs
index 32bacc8dc2..675812ac23 100644
--- a/MediaBrowser.Controller/Library/ILibraryManager.cs
+++ b/MediaBrowser.Controller/Library/ILibraryManager.cs
@@ -286,7 +286,8 @@ namespace MediaBrowser.Controller.Library
///
/// The item.
/// The cancellation token.
- void ReattachUserData(BaseItem item, CancellationToken cancellationToken);
+ /// A task that represents the asynchronous reattachment operation.
+ Task ReattachUserDataAsync(BaseItem item, CancellationToken cancellationToken);
///
/// Retrieves the item.
diff --git a/MediaBrowser.Controller/Persistence/IItemRepository.cs b/MediaBrowser.Controller/Persistence/IItemRepository.cs
index 9443dd3f20..790efb86a6 100644
--- a/MediaBrowser.Controller/Persistence/IItemRepository.cs
+++ b/MediaBrowser.Controller/Persistence/IItemRepository.cs
@@ -40,7 +40,8 @@ public interface IItemRepository
///
/// The item.
/// The cancellation token.
- void ReattachUserData(BaseItem item, CancellationToken cancellationToken);
+ /// A task that represents the asynchronous reattachment operation.
+ Task ReattachUserDataAsync(BaseItem item, CancellationToken cancellationToken);
///
/// Retrieves the item.
diff --git a/MediaBrowser.Providers/Manager/MetadataService.cs b/MediaBrowser.Providers/Manager/MetadataService.cs
index 5b82b18cc3..e9cb46eab5 100644
--- a/MediaBrowser.Providers/Manager/MetadataService.cs
+++ b/MediaBrowser.Providers/Manager/MetadataService.cs
@@ -280,7 +280,7 @@ namespace MediaBrowser.Providers.Manager
await result.Item.UpdateToRepositoryAsync(reason, cancellationToken).ConfigureAwait(false);
if (reattachUserData)
{
- result.Item.ReattachUserData(cancellationToken);
+ await result.Item.ReattachUserDataAsync(cancellationToken).ConfigureAwait(false);
}
if (result.Item.SupportsPeople && result.People is not null)