People Aliases and Merging (#3795)
Co-authored-by: Joseph Milazzo <josephmajora@gmail.com>
This commit is contained in:
parent
cd2a6af6f2
commit
7ce36bfc44
67 changed files with 5288 additions and 284 deletions
|
@ -10,6 +10,7 @@ using API.DTOs.Collection;
|
|||
using API.DTOs.KavitaPlus.ExternalMetadata;
|
||||
using API.DTOs.KavitaPlus.Metadata;
|
||||
using API.DTOs.Metadata.Matching;
|
||||
using API.DTOs.Person;
|
||||
using API.DTOs.Recommendation;
|
||||
using API.DTOs.Scrobbling;
|
||||
using API.DTOs.SeriesDetail;
|
||||
|
@ -17,8 +18,10 @@ using API.Entities;
|
|||
using API.Entities.Enums;
|
||||
using API.Entities.Metadata;
|
||||
using API.Entities.MetadataMatching;
|
||||
using API.Entities.Person;
|
||||
using API.Extensions;
|
||||
using API.Helpers;
|
||||
using API.Helpers.Builders;
|
||||
using API.Services.Tasks.Metadata;
|
||||
using API.Services.Tasks.Scanner.Parser;
|
||||
using API.SignalR;
|
||||
|
@ -614,12 +617,8 @@ public class ExternalMetadataService : IExternalMetadataService
|
|||
madeModification = await UpdateTags(series, settings, externalMetadata, processedTags) || madeModification;
|
||||
madeModification = UpdateAgeRating(series, settings, processedGenres.Concat(processedTags)) || madeModification;
|
||||
|
||||
var staff = (externalMetadata.Staff ?? []).Select(s =>
|
||||
{
|
||||
s.Name = settings.FirstLastPeopleNaming ? $"{s.FirstName} {s.LastName}" : $"{s.LastName} {s.FirstName}";
|
||||
var staff = await SetNameAndAddAliases(settings, externalMetadata.Staff);
|
||||
|
||||
return s;
|
||||
}).ToList();
|
||||
madeModification = await UpdateWriters(series, settings, staff) || madeModification;
|
||||
madeModification = await UpdateArtists(series, settings, staff) || madeModification;
|
||||
madeModification = await UpdateCharacters(series, settings, externalMetadata.Characters) || madeModification;
|
||||
|
@ -632,6 +631,49 @@ public class ExternalMetadataService : IExternalMetadataService
|
|||
return madeModification;
|
||||
}
|
||||
|
||||
private async Task<List<SeriesStaffDto>> SetNameAndAddAliases(MetadataSettingsDto settings, IList<SeriesStaffDto>? staff)
|
||||
{
|
||||
if (staff == null || staff.Count == 0) return [];
|
||||
|
||||
var nameMappings = staff.Select(s => new
|
||||
{
|
||||
Staff = s,
|
||||
PreferredName = settings.FirstLastPeopleNaming ? $"{s.FirstName} {s.LastName}" : $"{s.LastName} {s.FirstName}",
|
||||
AlternativeName = !settings.FirstLastPeopleNaming ? $"{s.FirstName} {s.LastName}" : $"{s.LastName} {s.FirstName}"
|
||||
}).ToList();
|
||||
|
||||
var preferredNames = nameMappings.Select(n => n.PreferredName.ToNormalized()).Distinct().ToList();
|
||||
var alternativeNames = nameMappings.Select(n => n.AlternativeName.ToNormalized()).Distinct().ToList();
|
||||
|
||||
var existingPeople = await _unitOfWork.PersonRepository.GetPeopleByNames(preferredNames.Union(alternativeNames).ToList());
|
||||
var existingPeopleDictionary = PersonHelper.ConstructNameAndAliasDictionary(existingPeople);
|
||||
|
||||
var modified = false;
|
||||
foreach (var mapping in nameMappings)
|
||||
{
|
||||
mapping.Staff.Name = mapping.PreferredName;
|
||||
|
||||
if (existingPeopleDictionary.ContainsKey(mapping.PreferredName.ToNormalized()))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
|
||||
if (existingPeopleDictionary.TryGetValue(mapping.AlternativeName.ToNormalized(), out var person))
|
||||
{
|
||||
modified = true;
|
||||
person.Aliases.Add(new PersonAliasBuilder(mapping.PreferredName).Build());
|
||||
}
|
||||
}
|
||||
|
||||
if (modified)
|
||||
{
|
||||
await _unitOfWork.CommitAsync();
|
||||
}
|
||||
|
||||
return [.. staff];
|
||||
}
|
||||
|
||||
private static void GenerateGenreAndTagLists(ExternalSeriesDetailDto externalMetadata, MetadataSettingsDto settings,
|
||||
ref List<string> processedTags, ref List<string> processedGenres)
|
||||
{
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue