aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCody Robibero <cody@robibe.ro>2026-08-23 17:38:19 -0400
committerGitHub <noreply@github.com>2026-08-23 17:38:19 -0400
commit1cc698a30b7e17285441f8407d4e904ec7cd4584 (patch)
treeeb2f13edb3d1e65d8fb447f9754db1d7928dc17d
parentaf8e19b16929188a4621a17c4a2f4d2008f886ec (diff)
parent4cd24a19d40caded21ca9f599ecbc36da54d26fa (diff)
Merge pull request #17702 from Shadowghost/fix-person-metadata-refresh
Fix person metadata not being fetched on demand or by the people task
-rw-r--r--Emby.Server.Implementations/ScheduledTasks/Tasks/PeopleValidationTask.cs4
-rw-r--r--Jellyfin.Api/Controllers/UserLibraryController.cs37
-rw-r--r--MediaBrowser.Providers/Manager/MetadataService.cs5
3 files changed, 30 insertions, 16 deletions
diff --git a/Emby.Server.Implementations/ScheduledTasks/Tasks/PeopleValidationTask.cs b/Emby.Server.Implementations/ScheduledTasks/Tasks/PeopleValidationTask.cs
index dff9a473af..bd73f63aa7 100644
--- a/Emby.Server.Implementations/ScheduledTasks/Tasks/PeopleValidationTask.cs
+++ b/Emby.Server.Implementations/ScheduledTasks/Tasks/PeopleValidationTask.cs
@@ -243,8 +243,8 @@ public class PeopleValidationTask : IScheduledTask, IConfigurableScheduledTask
var options = new MetadataRefreshOptions(new DirectoryService(_fileSystem))
{
- ImageRefreshMode = hasImage ? MetadataRefreshMode.ValidationOnly : MetadataRefreshMode.Default,
- MetadataRefreshMode = hasOverview ? MetadataRefreshMode.ValidationOnly : MetadataRefreshMode.Default
+ ImageRefreshMode = hasImage ? MetadataRefreshMode.ValidationOnly : MetadataRefreshMode.FullRefresh,
+ MetadataRefreshMode = hasOverview ? MetadataRefreshMode.ValidationOnly : MetadataRefreshMode.FullRefresh
};
await item.RefreshMetadata(options, cancellationToken).ConfigureAwait(false);
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>
diff --git a/MediaBrowser.Providers/Manager/MetadataService.cs b/MediaBrowser.Providers/Manager/MetadataService.cs
index c810fa523e..26dc8f9930 100644
--- a/MediaBrowser.Providers/Manager/MetadataService.cs
+++ b/MediaBrowser.Providers/Manager/MetadataService.cs
@@ -209,7 +209,10 @@ namespace MediaBrowser.Providers.Manager
}
}
- if (hasRefreshedMetadata && hasRefreshedImages)
+ var attemptedFetch = refreshOptions.MetadataRefreshMode > MetadataRefreshMode.ValidationOnly
+ || refreshOptions.ImageRefreshMode > MetadataRefreshMode.ValidationOnly;
+
+ if (hasRefreshedMetadata && hasRefreshedImages && attemptedFetch)
{
item.DateLastRefreshed = DateTime.UtcNow;
updateType |= item.OnMetadataChanged();