using System.Collections.Generic; using System.IO; using System.Linq; using NzbDrone.Common; using NzbDrone.Common.Extensions; using NzbDrone.Core.Extras.Files; using NzbDrone.Core.Tv; namespace NzbDrone.Core.Extras { public abstract class ImportExistingExtraFilesBase : IImportExistingExtraFiles where TExtraFile : ExtraFile, new() { private readonly IExtraFileService _extraFileService; public ImportExistingExtraFilesBase(IExtraFileService extraFileService) { _extraFileService = extraFileService; } public abstract int Order { get; } public abstract IEnumerable ProcessFiles(Series series, List filesOnDisk, List importedFiles); public virtual List FilterAndClean(Series series, List filesOnDisk, List importedFiles) { var seriesFiles = _extraFileService.GetFilesBySeries(series.Id); Clean(series, filesOnDisk, importedFiles, seriesFiles); return Filter(series, filesOnDisk, importedFiles, seriesFiles); } private List Filter(Series series, List filesOnDisk, List importedFiles, List seriesFiles) { var filteredFiles = filesOnDisk; filteredFiles = filteredFiles.Except(seriesFiles.Select(f => Path.Combine(series.Path, f.RelativePath)).ToList(), PathEqualityComparer.Instance).ToList(); return filteredFiles.Except(importedFiles, PathEqualityComparer.Instance).ToList(); } private void Clean(Series series, List filesOnDisk, List importedFiles, List seriesFiles) { var alreadyImportedFileIds = seriesFiles.IntersectBy(f => Path.Combine(series.Path, f.RelativePath), importedFiles, i => i, PathEqualityComparer.Instance) .Select(f => f.Id); var deletedFiles = seriesFiles.ExceptBy(f => Path.Combine(series.Path, f.RelativePath), filesOnDisk, i => i, PathEqualityComparer.Instance) .Select(f => f.Id); _extraFileService.DeleteMany(alreadyImportedFileIds); _extraFileService.DeleteMany(deletedFiles); } } }