2018-02-15 12:39:01 +00:00
|
|
|
using System.Collections.Generic;
|
2015-12-25 09:22:00 +00:00
|
|
|
using System.IO;
|
|
|
|
using System.Linq;
|
|
|
|
using NzbDrone.Common;
|
|
|
|
using NzbDrone.Common.Extensions;
|
|
|
|
using NzbDrone.Core.Extras.Files;
|
2018-03-14 20:41:36 +00:00
|
|
|
using NzbDrone.Core.Movies;
|
2015-12-25 09:22:00 +00:00
|
|
|
|
|
|
|
namespace NzbDrone.Core.Extras
|
|
|
|
{
|
|
|
|
public abstract class ImportExistingExtraFilesBase<TExtraFile> : IImportExistingExtraFiles
|
|
|
|
where TExtraFile : ExtraFile, new()
|
|
|
|
{
|
|
|
|
private readonly IExtraFileService<TExtraFile> _extraFileService;
|
|
|
|
|
|
|
|
public ImportExistingExtraFilesBase(IExtraFileService<TExtraFile> extraFileService)
|
|
|
|
{
|
|
|
|
_extraFileService = extraFileService;
|
|
|
|
}
|
|
|
|
|
|
|
|
public abstract int Order { get; }
|
2018-02-15 12:39:01 +00:00
|
|
|
public abstract IEnumerable<ExtraFile> ProcessFiles(Movie movie, List<string> filesOnDisk, List<string> importedFiles);
|
2015-12-25 09:22:00 +00:00
|
|
|
|
2018-02-15 12:39:01 +00:00
|
|
|
public virtual ImportExistingExtraFileFilterResult<TExtraFile> FilterAndClean(Movie movie, List<string> filesOnDisk, List<string> importedFiles)
|
2015-12-25 09:22:00 +00:00
|
|
|
{
|
2018-02-15 12:39:01 +00:00
|
|
|
var movieFiles = _extraFileService.GetFilesByMovie(movie.Id);
|
2015-12-25 09:22:00 +00:00
|
|
|
|
2018-02-15 12:39:01 +00:00
|
|
|
Clean(movie, filesOnDisk, importedFiles, movieFiles);
|
2015-12-25 09:22:00 +00:00
|
|
|
|
2018-02-15 12:39:01 +00:00
|
|
|
return Filter(movie, filesOnDisk, importedFiles, movieFiles);
|
2015-12-25 09:22:00 +00:00
|
|
|
}
|
|
|
|
|
2018-02-15 12:39:01 +00:00
|
|
|
private ImportExistingExtraFileFilterResult<TExtraFile> Filter(Movie movie, List<string> filesOnDisk, List<string> importedFiles, List<TExtraFile> movieFiles)
|
2015-12-25 09:22:00 +00:00
|
|
|
{
|
2018-02-15 12:39:01 +00:00
|
|
|
var previouslyImported = movieFiles.IntersectBy(s => Path.Combine(movie.Path, s.RelativePath), filesOnDisk, f => f, PathEqualityComparer.Instance).ToList();
|
|
|
|
var filteredFiles = filesOnDisk.Except(previouslyImported.Select(f => Path.Combine(movie.Path, f.RelativePath)).ToList(), PathEqualityComparer.Instance)
|
2016-09-18 18:04:56 +00:00
|
|
|
.Except(importedFiles, PathEqualityComparer.Instance)
|
|
|
|
.ToList();
|
|
|
|
|
|
|
|
// Return files that are already imported so they aren't imported again by other importers.
|
|
|
|
// Filter out files that were previously imported and as well as ones imported by other importers.
|
|
|
|
return new ImportExistingExtraFileFilterResult<TExtraFile>(previouslyImported, filteredFiles);
|
2015-12-25 09:22:00 +00:00
|
|
|
}
|
|
|
|
|
2018-02-15 12:39:01 +00:00
|
|
|
private void Clean(Movie movie, List<string> filesOnDisk, List<string> importedFiles, List<TExtraFile> movieFiles)
|
2015-12-25 09:22:00 +00:00
|
|
|
{
|
2018-02-15 12:39:01 +00:00
|
|
|
var alreadyImportedFileIds = movieFiles.IntersectBy(f => Path.Combine(movie.Path, f.RelativePath), importedFiles, i => i, PathEqualityComparer.Instance)
|
2015-12-25 09:22:00 +00:00
|
|
|
.Select(f => f.Id);
|
|
|
|
|
2018-02-15 12:39:01 +00:00
|
|
|
var deletedFiles = movieFiles.ExceptBy(f => Path.Combine(movie.Path, f.RelativePath), filesOnDisk, i => i, PathEqualityComparer.Instance)
|
2015-12-25 09:22:00 +00:00
|
|
|
.Select(f => f.Id);
|
|
|
|
|
|
|
|
_extraFileService.DeleteMany(alreadyImportedFileIds);
|
|
|
|
_extraFileService.DeleteMany(deletedFiles);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|