diff --git a/CHANGELOG.md b/CHANGELOG.md index 43a88d505..16c46c2e4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -44,6 +44,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). - Use other video artwork in XMLTV template - Properly update (add or remove) artwork for all local media libraries when files have changed - Sync Plex library name changes +- Sync Plex episode title, plot, year, date added, release date, episode number changes - Sync Jellyfin and Emby library name and type changes - Library type (movies, shows) can only be changed when synchronization is *disabled* for the library in ETV diff --git a/ErsatzTV.Infrastructure/Data/Repositories/PlexTelevisionRepository.cs b/ErsatzTV.Infrastructure/Data/Repositories/PlexTelevisionRepository.cs index 9588e9c10..083e21f1b 100644 --- a/ErsatzTV.Infrastructure/Data/Repositories/PlexTelevisionRepository.cs +++ b/ErsatzTV.Infrastructure/Data/Repositories/PlexTelevisionRepository.cs @@ -357,7 +357,7 @@ public class PlexTelevisionRepository : IPlexTelevisionRepository var result = new MediaItemScanResult(plexEpisode) { IsAdded = false }; if (plexEpisode.Etag != item.Etag || deepScan) { - foreach (BaseError error in await UpdateEpisodePath(dbContext, plexEpisode, item, cancellationToken)) + foreach (BaseError error in await UpdateEpisode(dbContext, plexEpisode, item, cancellationToken)) { return error; } @@ -720,7 +720,7 @@ public class PlexTelevisionRepository : IPlexTelevisionRepository } } - private async Task> UpdateEpisodePath( + private async Task> UpdateEpisode( TvContext dbContext, PlexEpisode existing, PlexEpisode incoming, @@ -739,7 +739,6 @@ public class PlexTelevisionRepository : IPlexTelevisionRepository version.DateAdded = incomingVersion.DateAdded; // media file - if (version.MediaFiles.Head() is PlexMediaFile file && incomingVersion.MediaFiles.Head() is PlexMediaFile incomingFile) { @@ -773,6 +772,34 @@ public class PlexTelevisionRepository : IPlexTelevisionRepository cancellationToken: cancellationToken)); } + // metadata + foreach (EpisodeMetadata metadata in existing.EpisodeMetadata.HeadOrNone()) + { + foreach (EpisodeMetadata incomingMetadata in incoming.EpisodeMetadata.HeadOrNone()) + { + if (metadata.Title != incomingMetadata.Title || + metadata.Plot != incomingMetadata.Plot || + metadata.Year != incomingMetadata.Year || + metadata.DateAdded != incomingMetadata.DateAdded || + metadata.ReleaseDate != incomingMetadata.ReleaseDate || + metadata.EpisodeNumber != incomingMetadata.EpisodeNumber) + { + await dbContext.EpisodeMetadata + .Where(em => em.Id == metadata.Id) + .ExecuteUpdateAsync( + setters => setters + .SetProperty(em => em.Title, incomingMetadata.Title) + .SetProperty(em => em.SortTitle, incomingMetadata.SortTitle) + .SetProperty(em => em.Plot, incomingMetadata.Plot) + .SetProperty(em => em.Year, incomingMetadata.Year) + .SetProperty(em => em.DateAdded, incomingMetadata.DateAdded) + .SetProperty(em => em.ReleaseDate, incomingMetadata.ReleaseDate) + .SetProperty(em => em.EpisodeNumber, incomingMetadata.EpisodeNumber), + cancellationToken); + } + } + } + return Option.None; } catch (Exception)