From 3363d2c9d7462ea0f7256d874a71aeac14848441 Mon Sep 17 00:00:00 2001 From: Jason Dove Date: Tue, 5 Oct 2021 06:27:05 -0500 Subject: [PATCH] update plex paths when they are changed (#394) --- CHANGELOG.md | 1 + .../Fakes/FakeTelevisionRepository.cs | 1 + .../Repositories/IMovieRepository.cs | 1 + .../Repositories/ITelevisionRepository.cs | 1 + ErsatzTV.Core/Plex/PlexMovieLibraryScanner.cs | 18 ++++++++++++++++++ .../Plex/PlexTelevisionLibraryScanner.cs | 18 ++++++++++++++++++ .../Data/Repositories/MovieRepository.cs | 5 +++++ .../Data/Repositories/TelevisionRepository.cs | 5 +++++ 8 files changed, 50 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2c3a44632..c33b72bdd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). ### Fixed - Include Specials/Season 0 `episode-num` entry in XMLTV - Fix some transcoding edge cases with VAAPI and pixel formats `yuv420p10le`, `yuv444p10le` and `yuv444p` +- Update Plex movie and episode paths when they are changed within Plex ## [0.0.61-alpha] - 2021-09-30 ### Fixed diff --git a/ErsatzTV.Core.Tests/Fakes/FakeTelevisionRepository.cs b/ErsatzTV.Core.Tests/Fakes/FakeTelevisionRepository.cs index 14f6bf900..615d22278 100644 --- a/ErsatzTV.Core.Tests/Fakes/FakeTelevisionRepository.cs +++ b/ErsatzTV.Core.Tests/Fakes/FakeTelevisionRepository.cs @@ -97,5 +97,6 @@ namespace ErsatzTV.Core.Tests.Fakes public Task AddDirector(EpisodeMetadata metadata, Director director) => throw new NotSupportedException(); public Task AddWriter(EpisodeMetadata metadata, Writer writer) => throw new NotSupportedException(); + public Task UpdatePath(int mediaFileId, string path) => throw new NotSupportedException(); } } diff --git a/ErsatzTV.Core/Interfaces/Repositories/IMovieRepository.cs b/ErsatzTV.Core/Interfaces/Repositories/IMovieRepository.cs index a6a27e584..b832299c7 100644 --- a/ErsatzTV.Core/Interfaces/Repositories/IMovieRepository.cs +++ b/ErsatzTV.Core/Interfaces/Repositories/IMovieRepository.cs @@ -33,5 +33,6 @@ namespace ErsatzTV.Core.Interfaces.Repositories Task> UpdateEmby(EmbyMovie movie); Task AddDirector(MovieMetadata metadata, Director director); Task AddWriter(MovieMetadata metadata, Writer writer); + Task UpdatePath(int mediaFileId, string path); } } diff --git a/ErsatzTV.Core/Interfaces/Repositories/ITelevisionRepository.cs b/ErsatzTV.Core/Interfaces/Repositories/ITelevisionRepository.cs index 6a3cb8e4b..0774c4888 100644 --- a/ErsatzTV.Core/Interfaces/Repositories/ITelevisionRepository.cs +++ b/ErsatzTV.Core/Interfaces/Repositories/ITelevisionRepository.cs @@ -51,5 +51,6 @@ namespace ErsatzTV.Core.Interfaces.Repositories Task RemoveMetadata(Episode episode, EpisodeMetadata metadata); Task AddDirector(EpisodeMetadata metadata, Director director); Task AddWriter(EpisodeMetadata metadata, Writer writer); + Task UpdatePath(int mediaFileId, string path); } } diff --git a/ErsatzTV.Core/Plex/PlexMovieLibraryScanner.cs b/ErsatzTV.Core/Plex/PlexMovieLibraryScanner.cs index 5207107b3..6fe81ae1b 100644 --- a/ErsatzTV.Core/Plex/PlexMovieLibraryScanner.cs +++ b/ErsatzTV.Core/Plex/PlexMovieLibraryScanner.cs @@ -156,6 +156,24 @@ namespace ErsatzTV.Core.Plex MediaVersion existingVersion = existing.MediaVersions.Head(); MediaVersion incomingVersion = incoming.MediaVersions.Head(); + foreach (MediaFile incomingFile in incomingVersion.MediaFiles.HeadOrNone()) + { + foreach (MediaFile existingFile in existingVersion.MediaFiles.HeadOrNone()) + { + if (incomingFile.Path != existingFile.Path) + { + _logger.LogDebug( + "Plex movie has moved from {OldPath} to {NewPath}", + existingFile.Path, + incomingFile.Path); + + existingFile.Path = incomingFile.Path; + + await _movieRepository.UpdatePath(existingFile.Id, incomingFile.Path); + } + } + } + if (incomingVersion.DateUpdated > existingVersion.DateUpdated || !existingVersion.Streams.Any()) { string localPath = _plexPathReplacementService.GetReplacementPlexPath( diff --git a/ErsatzTV.Core/Plex/PlexTelevisionLibraryScanner.cs b/ErsatzTV.Core/Plex/PlexTelevisionLibraryScanner.cs index 64e26fb4c..f75f8e0a3 100644 --- a/ErsatzTV.Core/Plex/PlexTelevisionLibraryScanner.cs +++ b/ErsatzTV.Core/Plex/PlexTelevisionLibraryScanner.cs @@ -514,6 +514,24 @@ namespace ErsatzTV.Core.Plex { MediaVersion existingVersion = existing.MediaVersions.Head(); MediaVersion incomingVersion = incoming.MediaVersions.Head(); + + foreach (MediaFile incomingFile in incomingVersion.MediaFiles.HeadOrNone()) + { + foreach (MediaFile existingFile in existingVersion.MediaFiles.HeadOrNone()) + { + if (incomingFile.Path != existingFile.Path) + { + _logger.LogDebug( + "Plex episode has moved from {OldPath} to {NewPath}", + existingFile.Path, + incomingFile.Path); + + existingFile.Path = incomingFile.Path; + + await _televisionRepository.UpdatePath(existingFile.Id, incomingFile.Path); + } + } + } if (incomingVersion.DateUpdated > existingVersion.DateUpdated || !existingVersion.Streams.Any()) { diff --git a/ErsatzTV.Infrastructure/Data/Repositories/MovieRepository.cs b/ErsatzTV.Infrastructure/Data/Repositories/MovieRepository.cs index 1c5ab4feb..754b445dd 100644 --- a/ErsatzTV.Infrastructure/Data/Repositories/MovieRepository.cs +++ b/ErsatzTV.Infrastructure/Data/Repositories/MovieRepository.cs @@ -774,6 +774,11 @@ namespace ErsatzTV.Infrastructure.Data.Repositories "INSERT INTO Writer (Name, MovieMetadataId) VALUES (@Name, @MetadataId)", new { writer.Name, MetadataId = metadata.Id }).Map(result => result > 0); + public Task UpdatePath(int mediaFileId, string path) => + _dbConnection.ExecuteAsync( + "UPDATE MediaFile SET Path = @Path WHERE Id = @MediaFileId", + new { Path = path, MediaFileId = mediaFileId }).Map(_ => Unit.Default); + private static async Task>> AddMovie( TvContext dbContext, int libraryPathId, diff --git a/ErsatzTV.Infrastructure/Data/Repositories/TelevisionRepository.cs b/ErsatzTV.Infrastructure/Data/Repositories/TelevisionRepository.cs index 430829991..d331438fc 100644 --- a/ErsatzTV.Infrastructure/Data/Repositories/TelevisionRepository.cs +++ b/ErsatzTV.Infrastructure/Data/Repositories/TelevisionRepository.cs @@ -568,6 +568,11 @@ namespace ErsatzTV.Infrastructure.Data.Repositories "INSERT INTO Writer (Name, EpisodeMetadataId) VALUES (@Name, @MetadataId)", new { writer.Name, MetadataId = metadata.Id }).Map(result => result > 0); + public Task UpdatePath(int mediaFileId, string path) => + _dbConnection.ExecuteAsync( + "UPDATE MediaFile SET Path = @Path WHERE Id = @MediaFileId", + new { Path = path, MediaFileId = mediaFileId }).Map(_ => Unit.Default); + public async Task> GetShowItems(int showId) { IEnumerable ids = await _dbConnection.QueryAsync(