diff --git a/ErsatzTV.Core/Plex/PlexMovieLibraryScanner.cs b/ErsatzTV.Core/Plex/PlexMovieLibraryScanner.cs index 6fa61ae90..03032aa14 100644 --- a/ErsatzTV.Core/Plex/PlexMovieLibraryScanner.cs +++ b/ErsatzTV.Core/Plex/PlexMovieLibraryScanner.cs @@ -101,7 +101,48 @@ namespace ErsatzTV.Core.Plex return Right(existing).AsTask(); } - private Task> UpdateArtwork(PlexMovie existing, PlexMovie incoming) => - Right(existing).AsTask(); + private Task> UpdateArtwork(PlexMovie existing, PlexMovie incoming) + { + MovieMetadata existingMetadata = existing.MovieMetadata.Head(); + MovieMetadata incomingMetadata = incoming.MovieMetadata.Head(); + + UpdateArtworkIfNeeded(existingMetadata, incomingMetadata, ArtworkKind.Poster); + UpdateArtworkIfNeeded(existingMetadata, incomingMetadata, ArtworkKind.FanArt); + + return Right(existing).AsTask(); + } + + private void UpdateArtworkIfNeeded( + MovieMetadata existingMetadata, + MovieMetadata incomingMetadata, + ArtworkKind artworkKind) + { + Option maybeIncomingArtwork = Optional(incomingMetadata.Artwork).Flatten() + .Find(a => a.ArtworkKind == artworkKind); + + maybeIncomingArtwork.Match( + incomingArtwork => + { + Option maybeExistingArtwork = Optional(existingMetadata.Artwork).Flatten() + .Find(a => a.ArtworkKind == artworkKind); + + maybeExistingArtwork.Match( + existingArtwork => + { + existingArtwork.Path = incomingArtwork.Path; + existingArtwork.DateUpdated = incomingArtwork.DateUpdated; + }, + () => + { + existingMetadata.Artwork ??= new List(); + existingMetadata.Artwork.Add(incomingArtwork); + }); + }, + () => + { + existingMetadata.Artwork ??= new List(); + existingMetadata.Artwork.RemoveAll(a => a.ArtworkKind == artworkKind); + }); + } } } diff --git a/ErsatzTV.Infrastructure/Data/Repositories/MovieRepository.cs b/ErsatzTV.Infrastructure/Data/Repositories/MovieRepository.cs index 257e6cdad..d98feb9db 100644 --- a/ErsatzTV.Infrastructure/Data/Repositories/MovieRepository.cs +++ b/ErsatzTV.Infrastructure/Data/Repositories/MovieRepository.cs @@ -75,6 +75,8 @@ namespace ErsatzTV.Infrastructure.Data.Repositories Option maybeExisting = await _dbContext.PlexMovies .Include(i => i.MovieMetadata) .ThenInclude(mm => mm.Genres) + .Include(i => i.MovieMetadata) + .ThenInclude(mm => mm.Artwork) .Include(i => i.MediaVersions) .ThenInclude(mv => mv.MediaFiles) .OrderBy(i => i.Key)