From c2647c19124bfb4fa39348623d7db89eb2bfc358 Mon Sep 17 00:00:00 2001 From: Jason Dove Date: Thu, 18 Feb 2021 18:25:12 -0600 Subject: [PATCH] refactor poster saving --- .../Repositories/IMovieRepository.cs | 1 + ErsatzTV.Core/Metadata/LocalFolderScanner.cs | 22 +++++++++ ErsatzTV.Core/Metadata/MovieFolderScanner.cs | 9 ++-- .../Metadata/TelevisionFolderScanner.cs | 46 +++---------------- .../Data/Repositories/MovieRepository.cs | 6 +++ 5 files changed, 40 insertions(+), 44 deletions(-) diff --git a/ErsatzTV.Core/Interfaces/Repositories/IMovieRepository.cs b/ErsatzTV.Core/Interfaces/Repositories/IMovieRepository.cs index 7f30e84b9..db9de1af4 100644 --- a/ErsatzTV.Core/Interfaces/Repositories/IMovieRepository.cs +++ b/ErsatzTV.Core/Interfaces/Repositories/IMovieRepository.cs @@ -7,5 +7,6 @@ namespace ErsatzTV.Core.Interfaces.Repositories public interface IMovieRepository { public Task> GetOrAdd(int mediaSourceId, string path); + public Task Update(MovieMediaItem movie); } } diff --git a/ErsatzTV.Core/Metadata/LocalFolderScanner.cs b/ErsatzTV.Core/Metadata/LocalFolderScanner.cs index 946850217..c4a2e22e6 100644 --- a/ErsatzTV.Core/Metadata/LocalFolderScanner.cs +++ b/ErsatzTV.Core/Metadata/LocalFolderScanner.cs @@ -4,6 +4,8 @@ using System.IO; using System.Linq; using System.Threading.Tasks; using ErsatzTV.Core.Domain; +using ErsatzTV.Core.Interfaces.Domain; +using ErsatzTV.Core.Interfaces.Images; using ErsatzTV.Core.Interfaces.Metadata; using LanguageExt; using Microsoft.Extensions.Logging; @@ -40,15 +42,18 @@ namespace ErsatzTV.Core.Metadata private readonly ILocalFileSystem _localFileSystem; private readonly ILocalStatisticsProvider _localStatisticsProvider; + private readonly IImageCache _imageCache; private readonly ILogger _logger; protected LocalFolderScanner( ILocalFileSystem localFileSystem, ILocalStatisticsProvider localStatisticsProvider, + IImageCache imageCache, ILogger logger) { _localFileSystem = localFileSystem; _localStatisticsProvider = localStatisticsProvider; + _imageCache = imageCache; _logger = logger; } @@ -71,5 +76,22 @@ namespace ErsatzTV.Core.Metadata return BaseError.New(ex.Message); } } + + protected async Task SavePosterToDisk(T show, string posterPath, Func> update) where T : IHasAPoster + { + byte[] originalBytes = await File.ReadAllBytesAsync(posterPath); + Either maybeHash = await _imageCache.ResizeAndSaveImage(originalBytes, 220, null); + await maybeHash.Match( + hash => + { + show.Poster = hash; + return update(show); + }, + error => + { + _logger.LogWarning("Unable to save poster to disk from {Path}: {Error}", posterPath, error.Value); + return Task.CompletedTask; + }); + } } } diff --git a/ErsatzTV.Core/Metadata/MovieFolderScanner.cs b/ErsatzTV.Core/Metadata/MovieFolderScanner.cs index c10f86e2c..fbd79e3ea 100644 --- a/ErsatzTV.Core/Metadata/MovieFolderScanner.cs +++ b/ErsatzTV.Core/Metadata/MovieFolderScanner.cs @@ -3,6 +3,7 @@ using System.Collections.Generic; using System.IO; using System.Threading.Tasks; using ErsatzTV.Core.Domain; +using ErsatzTV.Core.Interfaces.Images; using ErsatzTV.Core.Interfaces.Metadata; using ErsatzTV.Core.Interfaces.Repositories; using LanguageExt; @@ -14,7 +15,6 @@ namespace ErsatzTV.Core.Metadata { private readonly ILocalFileSystem _localFileSystem; private readonly ILocalMetadataProvider _localMetadataProvider; - private readonly ILocalPosterProvider _localPosterProvider; private readonly ILogger _logger; private readonly IMovieRepository _movieRepository; @@ -23,14 +23,13 @@ namespace ErsatzTV.Core.Metadata IMovieRepository movieRepository, ILocalStatisticsProvider localStatisticsProvider, ILocalMetadataProvider localMetadataProvider, - ILocalPosterProvider localPosterProvider, + IImageCache imageCache, ILogger logger) - : base(localFileSystem, localStatisticsProvider, logger) + : base(localFileSystem, localStatisticsProvider, imageCache, logger) { _localFileSystem = localFileSystem; _movieRepository = movieRepository; _localMetadataProvider = localMetadataProvider; - _localPosterProvider = localPosterProvider; _logger = logger; } @@ -106,7 +105,7 @@ namespace ErsatzTV.Core.Metadata movie.PosterLastWriteTime < _localFileSystem.GetLastWriteTime(posterFile)) { _logger.LogDebug("Refreshing {Attribute} from {Path}", "Poster", posterFile); - await _localPosterProvider.SavePosterToDisk(movie, posterFile); + await SavePosterToDisk(movie, posterFile, _movieRepository.Update); } }); diff --git a/ErsatzTV.Core/Metadata/TelevisionFolderScanner.cs b/ErsatzTV.Core/Metadata/TelevisionFolderScanner.cs index 678bb695c..b5ecce1a4 100644 --- a/ErsatzTV.Core/Metadata/TelevisionFolderScanner.cs +++ b/ErsatzTV.Core/Metadata/TelevisionFolderScanner.cs @@ -26,7 +26,11 @@ namespace ErsatzTV.Core.Metadata ILocalStatisticsProvider localStatisticsProvider, ILocalMetadataProvider localMetadataProvider, IImageCache imageCache, - ILogger logger) : base(localFileSystem, localStatisticsProvider, logger) + ILogger logger) : base( + localFileSystem, + localStatisticsProvider, + imageCache, + logger) { _localFileSystem = localFileSystem; _televisionRepository = televisionRepository; @@ -177,7 +181,7 @@ namespace ErsatzTV.Core.Metadata show.PosterLastWriteTime < _localFileSystem.GetLastWriteTime(posterFile)) { _logger.LogDebug("Refreshing {Attribute} from {Path}", "Poster", posterFile); - await SavePosterToDisk(show, posterFile); + await SavePosterToDisk(show, posterFile, _televisionRepository.Update); } }); @@ -201,7 +205,7 @@ namespace ErsatzTV.Core.Metadata episode.PosterLastWriteTime < _localFileSystem.GetLastWriteTime(posterFile)) { _logger.LogDebug("Refreshing {Attribute} from {Path}", "Thumbnail", posterFile); - await SavePosterToDisk(episode, posterFile); + await SavePosterToDisk(episode, posterFile, _televisionRepository.Update); } }); @@ -238,42 +242,6 @@ namespace ErsatzTV.Core.Metadata .HeadOrNone(); } - // TODO: refactor this to work with both scanners, everything that needs a poster - // also, return either ??? - private async Task SavePosterToDisk(TelevisionShow show, string posterPath) - { - byte[] originalBytes = await File.ReadAllBytesAsync(posterPath); - Either maybeHash = await _imageCache.ResizeAndSaveImage(originalBytes, 220, null); - await maybeHash.Match( - hash => - { - show.Poster = hash; - return _televisionRepository.Update(show); - }, - error => - { - _logger.LogWarning("Unable to save poster to disk from {Path}: {Error}", posterPath, error.Value); - return Task.CompletedTask; - }); - } - - private async Task SavePosterToDisk(TelevisionEpisodeMediaItem episode, string posterPath) - { - byte[] originalBytes = await File.ReadAllBytesAsync(posterPath); - Either maybeHash = await _imageCache.ResizeAndSaveImage(originalBytes, 220, null); - await maybeHash.Match( - hash => - { - episode.Poster = hash; - return _televisionRepository.Update(episode); - }, - error => - { - _logger.LogWarning("Unable to save poster to disk from {Path}: {Error}", posterPath, error.Value); - return Task.CompletedTask; - }); - } - private bool ShouldIncludeFolder(string folder) => !Path.GetFileName(folder).StartsWith('.') && !_localFileSystem.FileExists(Path.Combine(folder, ".etvignore")); diff --git a/ErsatzTV.Infrastructure/Data/Repositories/MovieRepository.cs b/ErsatzTV.Infrastructure/Data/Repositories/MovieRepository.cs index 19ee7b811..7c88a4116 100644 --- a/ErsatzTV.Infrastructure/Data/Repositories/MovieRepository.cs +++ b/ErsatzTV.Infrastructure/Data/Repositories/MovieRepository.cs @@ -26,6 +26,12 @@ namespace ErsatzTV.Infrastructure.Data.Repositories async () => await AddMovie(mediaSourceId, path)); } + public async Task Update(MovieMediaItem movie) + { + _dbContext.MovieMediaItems.Update(movie); + return await _dbContext.SaveChangesAsync() > 0; + } + private async Task> AddMovie(int mediaSourceId, string path) { try