Allow K+ to override data it has set itself Fixes #3632 #3836

This commit is contained in:
Amelia 2025-06-26 20:13:09 +02:00
parent 994e5d4d83
commit cbbd2f301e
14 changed files with 3908 additions and 31 deletions

View file

@ -16,6 +16,7 @@ using API.DTOs.Scrobbling;
using API.DTOs.SeriesDetail;
using API.Entities;
using API.Entities.Enums;
using API.Entities.Interfaces;
using API.Entities.Metadata;
using API.Entities.MetadataMatching;
using API.Entities.Person;
@ -526,6 +527,7 @@ public class ExternalMetadataService : IExternalMetadataService
if (madeMetadataModification)
{
_unitOfWork.SeriesRepository.Update(series);
_unitOfWork.SeriesRepository.Update(series.Metadata);
}
}
catch (Exception ex)
@ -782,7 +784,7 @@ public class ExternalMetadataService : IExternalMetadataService
if (externalCharacters == null || externalCharacters.Count == 0) return false;
if (series.Metadata.CharacterLocked && !settings.HasOverride(MetadataSettingField.People))
if (series.Metadata.CharacterLocked && !HasForceOverride(settings, series.Metadata, MetadataSettingField.People))
{
return false;
}
@ -864,7 +866,7 @@ public class ExternalMetadataService : IExternalMetadataService
if (upstreamArtists.Count == 0) return false;
if (series.Metadata.CoverArtistLocked && !settings.HasOverride(MetadataSettingField.People))
if (series.Metadata.CoverArtistLocked && !HasForceOverride(settings, series.Metadata, MetadataSettingField.People))
{
return false;
}
@ -920,7 +922,7 @@ public class ExternalMetadataService : IExternalMetadataService
if (upstreamWriters.Count == 0) return false;
if (series.Metadata.WriterLocked && !settings.HasOverride(MetadataSettingField.People))
if (series.Metadata.WriterLocked && !HasForceOverride(settings, series.Metadata, MetadataSettingField.People))
{
return false;
}
@ -973,7 +975,7 @@ public class ExternalMetadataService : IExternalMetadataService
if (!settings.EnableTags || processedTags.Count == 0) return false;
if (series.Metadata.TagsLocked && !settings.HasOverride(MetadataSettingField.Tags))
if (series.Metadata.TagsLocked && !HasForceOverride(settings, series.Metadata, MetadataSettingField.Tags))
{
return false;
}
@ -1014,7 +1016,7 @@ public class ExternalMetadataService : IExternalMetadataService
if (!settings.EnableGenres || processedGenres.Count == 0) return false;
if (series.Metadata.GenresLocked && !settings.HasOverride(MetadataSettingField.Genres))
if (series.Metadata.GenresLocked && !HasForceOverride(settings, series.Metadata, MetadataSettingField.Genres))
{
return false;
}
@ -1044,7 +1046,7 @@ public class ExternalMetadataService : IExternalMetadataService
{
if (!settings.EnablePublicationStatus) return false;
if (series.Metadata.PublicationStatusLocked && !settings.HasOverride(MetadataSettingField.PublicationStatus))
if (series.Metadata.PublicationStatusLocked && !HasForceOverride(settings, series.Metadata, MetadataSettingField.PublicationStatus))
{
return false;
}
@ -1058,6 +1060,7 @@ public class ExternalMetadataService : IExternalMetadataService
series.Metadata.PublicationStatus = status;
series.Metadata.PublicationStatusLocked = true;
series.Metadata.AddKPlusOverride(MetadataSettingField.PublicationStatus);
return true;
}
catch (Exception ex)
@ -1071,7 +1074,7 @@ public class ExternalMetadataService : IExternalMetadataService
private bool UpdateAgeRating(Series series, MetadataSettingsDto settings, IEnumerable<string> allExternalTags)
{
if (series.Metadata.AgeRatingLocked && !settings.HasOverride(MetadataSettingField.AgeRating))
if (series.Metadata.AgeRatingLocked && !HasForceOverride(settings, series.Metadata, MetadataSettingField.AgeRating))
{
return false;
}
@ -1087,6 +1090,7 @@ public class ExternalMetadataService : IExternalMetadataService
if (series.Metadata.AgeRating <= ageRating)
{
series.Metadata.AgeRating = ageRating;
series.Metadata.AddKPlusOverride(MetadataSettingField.AgeRating);
return true;
}
}
@ -1127,6 +1131,7 @@ public class ExternalMetadataService : IExternalMetadataService
madeModification = UpdateChapterTitle(chapter, settings, potentialMatch.Title, series.Name) || madeModification;
madeModification = UpdateChapterSummary(chapter, settings, potentialMatch.Summary) || madeModification;
madeModification = UpdateChapterReleaseDate(chapter, settings, potentialMatch.ReleaseDate) || madeModification;
// TODO: Update to set KPlusOverride
madeModification = await UpdateChapterPublisher(chapter, settings, potentialMatch.Publisher) || madeModification;
madeModification = await UpdateChapterPeople(chapter, settings, PersonRole.CoverArtist, potentialMatch.Artists) || madeModification;
@ -1245,17 +1250,18 @@ public class ExternalMetadataService : IExternalMetadataService
if (string.IsNullOrEmpty(summary)) return false;
if (chapter.SummaryLocked && !settings.HasOverride(MetadataSettingField.ChapterSummary))
if (chapter.SummaryLocked && !HasForceOverride(settings, chapter, MetadataSettingField.ChapterSummary))
{
return false;
}
if (!string.IsNullOrWhiteSpace(summary) && !settings.HasOverride(MetadataSettingField.ChapterSummary))
if (!string.IsNullOrWhiteSpace(summary) && !HasForceOverride(settings, chapter, MetadataSettingField.ChapterSummary))
{
return false;
}
chapter.Summary = StringHelper.RemoveSourceInDescription(StringHelper.SquashBreaklines(summary));
chapter.AddKPlusOverride(MetadataSettingField.ChapterSummary);
return true;
}
@ -1265,17 +1271,18 @@ public class ExternalMetadataService : IExternalMetadataService
if (string.IsNullOrEmpty(title)) return false;
if (chapter.TitleNameLocked && !settings.HasOverride(MetadataSettingField.ChapterTitle))
if (chapter.TitleNameLocked && !HasForceOverride(settings, chapter, MetadataSettingField.ChapterTitle))
{
return false;
}
if (!title.Contains(seriesName) && !settings.HasOverride(MetadataSettingField.ChapterTitle))
if (!title.Contains(seriesName) && !HasForceOverride(settings, chapter, MetadataSettingField.ChapterTitle))
{
return false;
}
chapter.TitleName = title;
chapter.AddKPlusOverride(MetadataSettingField.ChapterTitle);
return true;
}
@ -1285,17 +1292,18 @@ public class ExternalMetadataService : IExternalMetadataService
if (releaseDate == null || releaseDate == DateTime.MinValue) return false;
if (chapter.ReleaseDateLocked && !settings.HasOverride(MetadataSettingField.ChapterReleaseDate))
if (chapter.ReleaseDateLocked && !HasForceOverride(settings, chapter, MetadataSettingField.ChapterReleaseDate))
{
return false;
}
if (!settings.HasOverride(MetadataSettingField.ChapterReleaseDate))
if (!HasForceOverride(settings, chapter, MetadataSettingField.ChapterReleaseDate))
{
return false;
}
chapter.ReleaseDate = releaseDate.Value;
chapter.AddKPlusOverride(MetadataSettingField.ChapterReleaseDate);
return true;
}
@ -1305,12 +1313,12 @@ public class ExternalMetadataService : IExternalMetadataService
if (string.IsNullOrEmpty(publisher)) return false;
if (chapter.PublisherLocked && !settings.HasOverride(MetadataSettingField.ChapterPublisher))
if (chapter.PublisherLocked && !HasForceOverride(settings, chapter, MetadataSettingField.ChapterPublisher))
{
return false;
}
if (!string.IsNullOrWhiteSpace(publisher) && !settings.HasOverride(MetadataSettingField.ChapterPublisher))
if (!string.IsNullOrWhiteSpace(publisher) && !HasForceOverride(settings, chapter, MetadataSettingField.ChapterPublisher))
{
return false;
}
@ -1332,7 +1340,7 @@ public class ExternalMetadataService : IExternalMetadataService
if (string.IsNullOrEmpty(coverUrl)) return false;
if (chapter.CoverImageLocked && !settings.HasOverride(MetadataSettingField.ChapterCovers))
if (chapter.CoverImageLocked && !HasForceOverride(settings, chapter, MetadataSettingField.ChapterCovers))
{
return false;
}
@ -1343,6 +1351,7 @@ public class ExternalMetadataService : IExternalMetadataService
}
await DownloadChapterCovers(chapter, coverUrl);
chapter.AddKPlusOverride(MetadataSettingField.ChapterCovers);
return true;
}
@ -1352,7 +1361,7 @@ public class ExternalMetadataService : IExternalMetadataService
if (staff?.Count == 0) return false;
if (chapter.IsPersonRoleLocked(role) && !settings.HasOverride(MetadataSettingField.People))
if (chapter.IsPersonRoleLocked(role) && !HasForceOverride(settings, chapter, MetadataSettingField.People))
{
return false;
}
@ -1401,7 +1410,7 @@ public class ExternalMetadataService : IExternalMetadataService
if (string.IsNullOrEmpty(externalMetadata.CoverUrl)) return false;
if (series.CoverImageLocked && !settings.HasOverride(MetadataSettingField.Covers))
if (series.CoverImageLocked && !HasForceOverride(settings, series.Metadata, MetadataSettingField.Covers))
{
return false;
}
@ -1412,6 +1421,7 @@ public class ExternalMetadataService : IExternalMetadataService
}
await DownloadSeriesCovers(series, externalMetadata.CoverUrl);
series.Metadata.AddKPlusOverride(MetadataSettingField.Covers);
return true;
}
@ -1422,17 +1432,18 @@ public class ExternalMetadataService : IExternalMetadataService
if (!externalMetadata.StartDate.HasValue) return false;
if (series.Metadata.ReleaseYearLocked && !settings.HasOverride(MetadataSettingField.StartDate))
if (series.Metadata.ReleaseYearLocked && !HasForceOverride(settings, series.Metadata, MetadataSettingField.StartDate))
{
return false;
}
if (series.Metadata.ReleaseYear != 0 && !settings.HasOverride(MetadataSettingField.StartDate))
if (series.Metadata.ReleaseYear != 0 && !HasForceOverride(settings, series.Metadata, MetadataSettingField.StartDate))
{
return false;
}
series.Metadata.ReleaseYear = externalMetadata.StartDate.Value.Year;
series.Metadata.AddKPlusOverride(MetadataSettingField.StartDate);
return true;
}
@ -1440,12 +1451,12 @@ public class ExternalMetadataService : IExternalMetadataService
{
if (!settings.EnableLocalizedName) return false;
if (series.LocalizedNameLocked && !settings.HasOverride(MetadataSettingField.LocalizedName))
if (series.LocalizedNameLocked && !HasForceOverride(settings, series.Metadata, MetadataSettingField.LocalizedName))
{
return false;
}
if (!string.IsNullOrWhiteSpace(series.LocalizedName) && !settings.HasOverride(MetadataSettingField.LocalizedName))
if (!string.IsNullOrWhiteSpace(series.LocalizedName) && !HasForceOverride(settings, series.Metadata, MetadataSettingField.LocalizedName))
{
return false;
}
@ -1471,6 +1482,7 @@ public class ExternalMetadataService : IExternalMetadataService
}
series.Metadata.AddKPlusOverride(MetadataSettingField.LocalizedName);
return true;
}
@ -1480,17 +1492,18 @@ public class ExternalMetadataService : IExternalMetadataService
if (string.IsNullOrEmpty(externalMetadata.Summary)) return false;
if (series.Metadata.SummaryLocked && !settings.HasOverride(MetadataSettingField.Summary))
if (series.Metadata.SummaryLocked && !HasForceOverride(settings, series.Metadata, MetadataSettingField.Summary))
{
return false;
}
if (!string.IsNullOrWhiteSpace(series.Metadata.Summary) && !settings.HasOverride(MetadataSettingField.Summary))
if (!string.IsNullOrWhiteSpace(series.Metadata.Summary) && !HasForceOverride(settings, series.Metadata, MetadataSettingField.Summary))
{
return false;
}
series.Metadata.Summary = StringHelper.RemoveSourceInDescription(StringHelper.SquashBreaklines(externalMetadata.Summary));
series.Metadata.AddKPlusOverride(MetadataSettingField.Summary);
return true;
}
@ -1509,7 +1522,8 @@ public class ExternalMetadataService : IExternalMetadataService
{
try
{
await _coverDbService.SetSeriesCoverByUrl(series, coverUrl, false, true);
// Only choose a better image if we're overriding a user provided cover
await _coverDbService.SetSeriesCoverByUrl(series, coverUrl, false, !series.Metadata.HasSetKPlusMetadata(MetadataSettingField.Covers));
}
catch (Exception ex)
{
@ -1881,4 +1895,10 @@ public class ExternalMetadataService : IExternalMetadataService
return null;
}
private static bool HasForceOverride(MetadataSettingsDto settings, IHasKPlusMetadata kPlusMetadata,
MetadataSettingField field)
{
return settings.HasOverride(field) || kPlusMetadata.HasSetKPlusMetadata(field);
}
}