diff options
| author | Cody Robibero <cody@robibe.ro> | 2026-08-23 17:38:19 -0400 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2026-08-23 17:38:19 -0400 |
| commit | 1cc698a30b7e17285441f8407d4e904ec7cd4584 (patch) | |
| tree | eb2f13edb3d1e65d8fb447f9754db1d7928dc17d /Jellyfin.Api/Controllers/UserLibraryController.cs | |
| parent | af8e19b16929188a4621a17c4a2f4d2008f886ec (diff) | |
| parent | 4cd24a19d40caded21ca9f599ecbc36da54d26fa (diff) | |
Merge pull request #17702 from Shadowghost/fix-person-metadata-refresh
Fix person metadata not being fetched on demand or by the people task
Diffstat (limited to 'Jellyfin.Api/Controllers/UserLibraryController.cs')
| -rw-r--r-- | Jellyfin.Api/Controllers/UserLibraryController.cs | 37 |
1 files changed, 24 insertions, 13 deletions
diff --git a/Jellyfin.Api/Controllers/UserLibraryController.cs b/Jellyfin.Api/Controllers/UserLibraryController.cs index ea134a4619..da03032249 100644 --- a/Jellyfin.Api/Controllers/UserLibraryController.cs +++ b/Jellyfin.Api/Controllers/UserLibraryController.cs @@ -34,6 +34,8 @@ namespace Jellyfin.Api.Controllers; [Tags("Library")] public class UserLibraryController : BaseJellyfinApiController { + private static readonly TimeSpan RefreshOnDemandTimeout = TimeSpan.FromSeconds(3); + private readonly IUserManager _userManager; private readonly IUserDataManager _userDataRepository; private readonly ILibraryManager _libraryManager; @@ -79,7 +81,7 @@ public class UserLibraryController : BaseJellyfinApiController /// <returns>An <see cref="OkResult"/> containing the item.</returns> [HttpGet("Items/{itemId}")] [ProducesResponseType(StatusCodes.Status200OK)] - public ActionResult<BaseItemDto> GetItem( + public async Task<ActionResult<BaseItemDto>> GetItem( [FromQuery] Guid? userId, [FromRoute, Required] Guid itemId) { @@ -98,7 +100,7 @@ public class UserLibraryController : BaseJellyfinApiController return NotFound(); } - QueueRefreshOnDemandIfNeeded(item); + await RefreshOnDemandIfNeeded(item).ConfigureAwait(false); var dtoOptions = new DtoOptions(); @@ -116,7 +118,7 @@ public class UserLibraryController : BaseJellyfinApiController [ProducesResponseType(StatusCodes.Status200OK)] [Obsolete("Kept for backwards compatibility")] [ApiExplorerSettings(IgnoreApi = true)] - public ActionResult<BaseItemDto> GetItemLegacy( + public Task<ActionResult<BaseItemDto>> GetItemLegacy( [FromRoute, Required] Guid userId, [FromRoute, Required] Guid itemId) => GetItem(userId, itemId); @@ -643,7 +645,7 @@ public class UserLibraryController : BaseJellyfinApiController limit, groupItems); - private void QueueRefreshOnDemandIfNeeded(BaseItem item) + private async Task RefreshOnDemandIfNeeded(BaseItem item) { if (item is not Person) { @@ -656,15 +658,24 @@ public class UserLibraryController : BaseJellyfinApiController return; } - _providerManager.QueueRefresh( - item.Id, - new MetadataRefreshOptions(new DirectoryService(_fileSystem)) - { - MetadataRefreshMode = MetadataRefreshMode.FullRefresh, - ImageRefreshMode = MetadataRefreshMode.FullRefresh, - ForceSave = true - }, - RefreshPriority.High); + var options = new MetadataRefreshOptions(new DirectoryService(_fileSystem)) + { + MetadataRefreshMode = MetadataRefreshMode.FullRefresh, + ImageRefreshMode = MetadataRefreshMode.FullRefresh, + ForceSave = true + }; + + using var timeout = CancellationTokenSource.CreateLinkedTokenSource(HttpContext.RequestAborted); + timeout.CancelAfter(RefreshOnDemandTimeout); + + try + { + await item.RefreshMetadata(options, timeout.Token).ConfigureAwait(false); + } + catch (OperationCanceledException) when (!HttpContext.RequestAborted.IsCancellationRequested) + { + _providerManager.QueueRefresh(item.Id, options, RefreshPriority.High); + } } /// <summary> |
