A few more bug fixes (#3876)

Co-authored-by: Joseph Milazzo <joseph.v.milazzo@gmail.com>
This commit is contained in:
Fesaa 2025-06-28 18:45:02 +02:00 committed by GitHub
parent 4b9bbc5d78
commit d909e03baf
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
21 changed files with 3940 additions and 45 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;
}
@ -849,7 +851,7 @@ public class ExternalMetadataService : IExternalMetadataService
}
}
series.Metadata.AddKPlusOverride(MetadataSettingField.People);
return true;
}
@ -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;
}
@ -907,6 +909,7 @@ public class ExternalMetadataService : IExternalMetadataService
await DownloadAndSetPersonCovers(upstreamArtists);
series.Metadata.AddKPlusOverride(MetadataSettingField.People);
return true;
}
@ -920,7 +923,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;
}
@ -963,7 +966,7 @@ public class ExternalMetadataService : IExternalMetadataService
await _unitOfWork.CommitAsync();
await DownloadAndSetPersonCovers(upstreamWriters);
series.Metadata.AddKPlusOverride(MetadataSettingField.People);
return true;
}
@ -973,7 +976,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;
}
@ -990,6 +993,11 @@ public class ExternalMetadataService : IExternalMetadataService
madeModification = true;
}, () => series.Metadata.TagsLocked = true);
if (madeModification)
{
series.Metadata.AddKPlusOverride(MetadataSettingField.Tags);
}
return madeModification;
}
@ -1014,7 +1022,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;
}
@ -1035,6 +1043,12 @@ public class ExternalMetadataService : IExternalMetadataService
{
if (series.Metadata.Genres.FirstOrDefault(g => g.NormalizedTitle == genre.NormalizedTitle) != null) continue;
series.Metadata.Genres.Add(genre);
madeModification = true;
}
if (madeModification)
{
series.Metadata.AddKPlusOverride(MetadataSettingField.Genres);
}
return madeModification;
@ -1044,7 +1058,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 +1072,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 +1086,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 +1102,7 @@ public class ExternalMetadataService : IExternalMetadataService
if (series.Metadata.AgeRating <= ageRating)
{
series.Metadata.AgeRating = ageRating;
series.Metadata.AddKPlusOverride(MetadataSettingField.AgeRating);
return true;
}
}
@ -1127,7 +1143,10 @@ 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;
madeModification = await UpdateChapterPublisher(chapter, settings, potentialMatch.Publisher) || madeModification;
var hasUpdatedPublisher = await UpdateChapterPublisher(chapter, settings, potentialMatch.Publisher);
if (hasUpdatedPublisher) chapter.AddKPlusOverride(MetadataSettingField.ChapterPublisher);
madeModification = hasUpdatedPublisher || madeModification;
madeModification = await UpdateChapterPeople(chapter, settings, PersonRole.CoverArtist, potentialMatch.Artists) || madeModification;
madeModification = await UpdateChapterPeople(chapter, settings, PersonRole.Writer, potentialMatch.Writers) || madeModification;
@ -1245,17 +1264,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 +1285,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 +1306,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 +1327,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 +1354,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 +1365,7 @@ public class ExternalMetadataService : IExternalMetadataService
}
await DownloadChapterCovers(chapter, coverUrl);
chapter.AddKPlusOverride(MetadataSettingField.ChapterCovers);
return true;
}
@ -1352,7 +1375,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 +1424,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 +1435,7 @@ public class ExternalMetadataService : IExternalMetadataService
}
await DownloadSeriesCovers(series, externalMetadata.CoverUrl);
series.Metadata.AddKPlusOverride(MetadataSettingField.Covers);
return true;
}
@ -1422,17 +1446,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 +1465,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 +1496,7 @@ public class ExternalMetadataService : IExternalMetadataService
}
series.Metadata.AddKPlusOverride(MetadataSettingField.LocalizedName);
return true;
}
@ -1480,17 +1506,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 +1536,8 @@ public class ExternalMetadataService : IExternalMetadataService
{
try
{
await _coverDbService.SetSeriesCoverByUrl(series, coverUrl, false, true);
// Only choose the 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 +1909,10 @@ public class ExternalMetadataService : IExternalMetadataService
return null;
}
private static bool HasForceOverride(MetadataSettingsDto settings, IHasKPlusMetadata kPlusMetadata,
MetadataSettingField field)
{
return settings.HasOverride(field) || kPlusMetadata.HasSetKPlusMetadata(field);
}
}