From 79b2e9dbfe9a83c28aac366c30df28897f15965b Mon Sep 17 00:00:00 2001 From: Jason Dove Date: Sun, 14 Mar 2021 16:25:05 +0000 Subject: [PATCH] fix plex movie scanning performance (#74) --- .../Repositories/IMovieRepository.cs | 1 + ErsatzTV.Core/Plex/PlexMovieLibraryScanner.cs | 28 ++++++++++--------- .../Data/Repositories/MovieRepository.cs | 11 ++++++-- 3 files changed, 25 insertions(+), 15 deletions(-) diff --git a/ErsatzTV.Core/Interfaces/Repositories/IMovieRepository.cs b/ErsatzTV.Core/Interfaces/Repositories/IMovieRepository.cs index 416168734..8d2416748 100644 --- a/ErsatzTV.Core/Interfaces/Repositories/IMovieRepository.cs +++ b/ErsatzTV.Core/Interfaces/Repositories/IMovieRepository.cs @@ -16,5 +16,6 @@ namespace ErsatzTV.Core.Interfaces.Repositories Task> GetPagedMovies(int pageNumber, int pageSize); Task> FindMoviePaths(LibraryPath libraryPath); Task DeleteByPath(LibraryPath libraryPath, string path); + Task AddGenre(MovieMetadata metadata, Genre genre); } } diff --git a/ErsatzTV.Core/Plex/PlexMovieLibraryScanner.cs b/ErsatzTV.Core/Plex/PlexMovieLibraryScanner.cs index e7fb1c462..bde230af8 100644 --- a/ErsatzTV.Core/Plex/PlexMovieLibraryScanner.cs +++ b/ErsatzTV.Core/Plex/PlexMovieLibraryScanner.cs @@ -13,6 +13,7 @@ namespace ErsatzTV.Core.Plex public class PlexMovieLibraryScanner : PlexLibraryScanner, IPlexMovieLibraryScanner { private readonly ILogger _logger; + private readonly IMetadataRepository _metadataRepository; private readonly IMovieRepository _movieRepository; private readonly IPlexServerApiClient _plexServerApiClient; @@ -25,6 +26,7 @@ namespace ErsatzTV.Core.Plex { _plexServerApiClient = plexServerApiClient; _movieRepository = movieRepository; + _metadataRepository = metadataRepository; _logger = logger; } @@ -51,16 +53,11 @@ namespace ErsatzTV.Core.Plex .BindT(existing => UpdateMetadata(existing, incoming)) .BindT(existing => UpdateArtwork(existing, incoming)); - await maybeMovie.Match( - async movie => await _movieRepository.Update(movie), - error => - { - _logger.LogWarning( - "Error processing plex movie at {Key}: {Error}", - incoming.Key, - error.Value); - return Task.CompletedTask; - }); + maybeMovie.IfLeft( + error => _logger.LogWarning( + "Error processing plex movie at {Key}: {Error}", + incoming.Key, + error.Value)); } }, error => @@ -91,13 +88,16 @@ namespace ErsatzTV.Core.Plex Either maybeStatistics = await _plexServerApiClient.GetStatistics(incoming.Key.Split("/").Last(), connection, token); - maybeStatistics.IfRight( - mediaVersion => + await maybeStatistics.Match( + async mediaVersion => { existingVersion.SampleAspectRatio = mediaVersion.SampleAspectRatio ?? "1:1"; existingVersion.VideoScanKind = mediaVersion.VideoScanKind; existingVersion.DateUpdated = incomingVersion.DateUpdated; - }); + + await _metadataRepository.UpdateStatistics(existingVersion); + }, + _ => Task.CompletedTask); } return Right(existing); @@ -115,6 +115,7 @@ namespace ErsatzTV.Core.Plex .ToList()) { existingMetadata.Genres.Remove(genre); + _metadataRepository.RemoveGenre(genre); } foreach (Genre genre in incomingMetadata.Genres @@ -122,6 +123,7 @@ namespace ErsatzTV.Core.Plex .ToList()) { existingMetadata.Genres.Add(genre); + _movieRepository.AddGenre(existingMetadata, genre); } } diff --git a/ErsatzTV.Infrastructure/Data/Repositories/MovieRepository.cs b/ErsatzTV.Infrastructure/Data/Repositories/MovieRepository.cs index d98feb9db..1386316ab 100644 --- a/ErsatzTV.Infrastructure/Data/Repositories/MovieRepository.cs +++ b/ErsatzTV.Infrastructure/Data/Repositories/MovieRepository.cs @@ -72,7 +72,9 @@ namespace ErsatzTV.Infrastructure.Data.Repositories public async Task> GetOrAdd(PlexLibrary library, PlexMovie item) { - Option maybeExisting = await _dbContext.PlexMovies + await using TvContext context = _dbContextFactory.CreateDbContext(); + Option maybeExisting = await context.PlexMovies + .AsNoTracking() .Include(i => i.MovieMetadata) .ThenInclude(mm => mm.Genres) .Include(i => i.MovieMetadata) @@ -84,7 +86,7 @@ namespace ErsatzTV.Infrastructure.Data.Repositories return await maybeExisting.Match( plexMovie => Right(plexMovie).AsTask(), - async () => await AddPlexMovie(_dbContext, library, item)); + async () => await AddPlexMovie(context, library, item)); } public async Task Update(Movie movie) @@ -140,6 +142,11 @@ namespace ErsatzTV.Infrastructure.Data.Repositories return Unit.Default; } + public Task AddGenre(MovieMetadata metadata, Genre genre) => + _dbConnection.ExecuteAsync( + "INSERT INTO Genre (Name, MovieMetadataId) VALUES (@Name, @MetadataId)", + new { genre.Name, MetadataId = metadata.Id }).ToUnit(); + private async Task> AddMovie(int libraryPathId, string path) { try