Browse Source

refactor poster saving

pull/26/head
Jason Dove 6 years ago
parent
commit
c2647c1912
  1. 1
      ErsatzTV.Core/Interfaces/Repositories/IMovieRepository.cs
  2. 22
      ErsatzTV.Core/Metadata/LocalFolderScanner.cs
  3. 9
      ErsatzTV.Core/Metadata/MovieFolderScanner.cs
  4. 46
      ErsatzTV.Core/Metadata/TelevisionFolderScanner.cs
  5. 6
      ErsatzTV.Infrastructure/Data/Repositories/MovieRepository.cs

1
ErsatzTV.Core/Interfaces/Repositories/IMovieRepository.cs

@ -7,5 +7,6 @@ namespace ErsatzTV.Core.Interfaces.Repositories @@ -7,5 +7,6 @@ namespace ErsatzTV.Core.Interfaces.Repositories
public interface IMovieRepository
{
public Task<Either<BaseError, MovieMediaItem>> GetOrAdd(int mediaSourceId, string path);
public Task<bool> Update(MovieMediaItem movie);
}
}

22
ErsatzTV.Core/Metadata/LocalFolderScanner.cs

@ -4,6 +4,8 @@ using System.IO; @@ -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 @@ -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 @@ -71,5 +76,22 @@ namespace ErsatzTV.Core.Metadata
return BaseError.New(ex.Message);
}
}
protected async Task SavePosterToDisk<T>(T show, string posterPath, Func<T, Task<bool>> update) where T : IHasAPoster
{
byte[] originalBytes = await File.ReadAllBytesAsync(posterPath);
Either<BaseError, string> 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;
});
}
}
}

9
ErsatzTV.Core/Metadata/MovieFolderScanner.cs

@ -3,6 +3,7 @@ using System.Collections.Generic; @@ -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 @@ -14,7 +15,6 @@ namespace ErsatzTV.Core.Metadata
{
private readonly ILocalFileSystem _localFileSystem;
private readonly ILocalMetadataProvider _localMetadataProvider;
private readonly ILocalPosterProvider _localPosterProvider;
private readonly ILogger<MovieFolderScanner> _logger;
private readonly IMovieRepository _movieRepository;
@ -23,14 +23,13 @@ namespace ErsatzTV.Core.Metadata @@ -23,14 +23,13 @@ namespace ErsatzTV.Core.Metadata
IMovieRepository movieRepository,
ILocalStatisticsProvider localStatisticsProvider,
ILocalMetadataProvider localMetadataProvider,
ILocalPosterProvider localPosterProvider,
IImageCache imageCache,
ILogger<MovieFolderScanner> 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 @@ -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);
}
});

46
ErsatzTV.Core/Metadata/TelevisionFolderScanner.cs

@ -26,7 +26,11 @@ namespace ErsatzTV.Core.Metadata @@ -26,7 +26,11 @@ namespace ErsatzTV.Core.Metadata
ILocalStatisticsProvider localStatisticsProvider,
ILocalMetadataProvider localMetadataProvider,
IImageCache imageCache,
ILogger<TelevisionFolderScanner> logger) : base(localFileSystem, localStatisticsProvider, logger)
ILogger<TelevisionFolderScanner> logger) : base(
localFileSystem,
localStatisticsProvider,
imageCache,
logger)
{
_localFileSystem = localFileSystem;
_televisionRepository = televisionRepository;
@ -177,7 +181,7 @@ namespace ErsatzTV.Core.Metadata @@ -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 @@ -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 @@ -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<baseerror, unit> ???
private async Task SavePosterToDisk(TelevisionShow show, string posterPath)
{
byte[] originalBytes = await File.ReadAllBytesAsync(posterPath);
Either<BaseError, string> 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<BaseError, string> 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"));

6
ErsatzTV.Infrastructure/Data/Repositories/MovieRepository.cs

@ -26,6 +26,12 @@ namespace ErsatzTV.Infrastructure.Data.Repositories @@ -26,6 +26,12 @@ namespace ErsatzTV.Infrastructure.Data.Repositories
async () => await AddMovie(mediaSourceId, path));
}
public async Task<bool> Update(MovieMediaItem movie)
{
_dbContext.MovieMediaItems.Update(movie);
return await _dbContext.SaveChangesAsync() > 0;
}
private async Task<Either<BaseError, MovieMediaItem>> AddMovie(int mediaSourceId, string path)
{
try

Loading…
Cancel
Save