Apply review suggestions

This commit is contained in:
Shadowghost
2026-08-10 23:10:33 +02:00
parent f82101332d
commit 4e9713a032
2 changed files with 69 additions and 0 deletions
@@ -1137,6 +1137,8 @@ namespace MediaBrowser.Providers.Manager
if (!lockedFields.Contains(MetadataField.Cast))
{
RemoveInvalidProviderIds(sourceResult.People);
if (replaceData || targetResult.People is null || targetResult.People.Count == 0)
{
targetResult.People = sourceResult.People;
@@ -1291,6 +1293,32 @@ namespace MediaBrowser.Providers.Manager
}
}
private static void RemoveInvalidProviderIds(IReadOnlyList<PersonInfo> people)
{
if (people is null)
{
return;
}
foreach (var person in people)
{
if (person.ProviderIds is null || person.ProviderIds.Count == 0)
{
continue;
}
var invalidKeys = person.ProviderIds
.Where(id => !ProviderIdsExtensions.IsValidProviderId(id.Key, id.Value))
.Select(id => id.Key)
.ToArray();
foreach (var key in invalidKeys)
{
person.ProviderIds.Remove(key);
}
}
}
private static void MergePeople(IReadOnlyList<PersonInfo> source, IReadOnlyList<PersonInfo> target)
{
var sourceByName = source.ToLookup(p => p.Name.RemoveDiacritics(), StringComparer.OrdinalIgnoreCase);
@@ -2,7 +2,9 @@ using System;
using System.Collections.Generic;
using System.Threading;
using System.Threading.Tasks;
using Jellyfin.Data.Enums;
using MediaBrowser.Controller.Configuration;
using MediaBrowser.Controller.Entities;
using MediaBrowser.Controller.Entities.Movies;
using MediaBrowser.Controller.IO;
using MediaBrowser.Controller.Library;
@@ -95,6 +97,45 @@ namespace Jellyfin.Providers.Tests.Manager
Assert.Equal("tt0113375", item.GetProviderId(MetadataProvider.Imdb));
}
[Theory]
[InlineData(true)]
[InlineData(false)]
public async Task RefreshWithProviders_ForeignPersonProviderId_NotStored(bool replaceAllMetadata)
{
var item = new Movie { Name = "Test Movie" };
var existing = new MetadataResult<Movie> { Item = item };
existing.AddPerson(new PersonInfo { Name = "Some Actor", Type = PersonKind.Actor });
var provider = new Mock<IRemoteMetadataProvider<Movie, MovieInfo>>(MockBehavior.Loose);
provider.Setup(p => p.Name).Returns("Provider");
provider.Setup(p => p.GetMetadata(It.IsAny<MovieInfo>(), It.IsAny<CancellationToken>()))
.ReturnsAsync(() =>
{
var person = new PersonInfo { Name = "Some Actor", Type = PersonKind.Actor };
person.ProviderIds[MetadataProvider.Tmdb.ToString()] = "nm0000123";
person.ProviderIds[MetadataProvider.Imdb.ToString()] = "nm0000123";
var found = new MetadataResult<Movie> { HasMetadata = true, Item = new Movie { Name = "Test Movie" } };
found.AddPerson(person);
return found;
});
var service = new TestMetadataService();
await service.RefreshWithProvidersInternal(
existing,
new MovieInfo { Name = item.Name },
new MetadataRefreshOptions(Mock.Of<IDirectoryService>())
{
MetadataRefreshMode = MetadataRefreshMode.FullRefresh,
ReplaceAllMetadata = replaceAllMetadata
},
[provider.Object]).ConfigureAwait(true);
var mergedPerson = Assert.Single(existing.People);
Assert.False(mergedPerson.HasProviderId(MetadataProvider.Tmdb));
Assert.Equal("nm0000123", mergedPerson.GetProviderId(MetadataProvider.Imdb));
}
private sealed class TestMetadataService : MetadataService<Movie, MovieInfo>
{
public TestMetadataService()