using System.Collections.Generic; using System.IO; using System.Linq; using NzbDrone.Common; using NzbDrone.Common.Disk; using NzbDrone.Common.Extensions; using NzbDrone.Core.Configuration; using NzbDrone.Core.MediaFiles; using NzbDrone.Core.Tv; namespace NzbDrone.Core.Extras.Files { public interface IManageExtraFiles { int Order { get; } IEnumerable CreateAfterSeriesScan(Series series, List episodeFiles); IEnumerable CreateAfterEpisodeImport(Series series, EpisodeFile episodeFile); IEnumerable CreateAfterEpisodeImport(Series series, string seriesFolder, string seasonFolder); IEnumerable MoveFilesAfterRename(Series series, List episodeFiles); ExtraFile Import(Series series, EpisodeFile episodeFile, string path, string extension, bool readOnly); } public abstract class ExtraFileManager : IManageExtraFiles where TExtraFile : ExtraFile, new() { private readonly IConfigService _configService; private readonly IDiskTransferService _diskTransferService; private readonly IExtraFileService _extraFileService; public ExtraFileManager(IConfigService configService, IDiskTransferService diskTransferService, IExtraFileService extraFileService) { _configService = configService; _diskTransferService = diskTransferService; _extraFileService = extraFileService; } public abstract int Order { get; } public abstract IEnumerable CreateAfterSeriesScan(Series series, List episodeFiles); public abstract IEnumerable CreateAfterEpisodeImport(Series series, EpisodeFile episodeFile); public abstract IEnumerable CreateAfterEpisodeImport(Series series, string seriesFolder, string seasonFolder); public abstract IEnumerable MoveFilesAfterRename(Series series, List episodeFiles); public abstract ExtraFile Import(Series series, EpisodeFile episodeFile, string path, string extension, bool readOnly); protected TExtraFile ImportFile(Series series, EpisodeFile episodeFile, string path, string extension, bool readOnly) { var newFileName = Path.Combine(series.Path, Path.ChangeExtension(episodeFile.RelativePath, extension)); var transferMode = TransferMode.Move; if (readOnly) { transferMode = _configService.CopyUsingHardlinks ? TransferMode.HardLinkOrCopy : TransferMode.Copy; } _diskTransferService.TransferFile(path, newFileName, transferMode, true, false); return new TExtraFile { SeriesId = series.Id, SeasonNumber = episodeFile.SeasonNumber, EpisodeFileId = episodeFile.Id, RelativePath = series.Path.GetRelativePath(newFileName), Extension = Path.GetExtension(path) }; } } }