using System.Collections.Generic; using System.IO; using System.Linq; using NLog; using NzbDrone.Common.Messaging; using NzbDrone.Core.Configuration; using NzbDrone.Core.MediaFiles.Events; using NzbDrone.Core.Tv.Events; namespace NzbDrone.Core.MediaFiles { public interface IMediaFileService { EpisodeFile Add(EpisodeFile episodeFile); void Update(EpisodeFile episodeFile); void Delete(EpisodeFile episodeFile); bool Exists(string path); EpisodeFile GetFileByPath(string path); List GetFilesBySeries(int seriesId); List FilterExistingFiles(List files, int seriesId); } public class MediaFileService : IMediaFileService, IHandleAsync { private readonly IConfigService _configService; private readonly IMessageAggregator _messageAggregator; private readonly Logger _logger; private readonly IMediaFileRepository _mediaFileRepository; public MediaFileService(IMediaFileRepository mediaFileRepository, IConfigService configService, IMessageAggregator messageAggregator, Logger logger) { _mediaFileRepository = mediaFileRepository; _configService = configService; _messageAggregator = messageAggregator; _logger = logger; } public EpisodeFile Add(EpisodeFile episodeFile) { var addedFile = _mediaFileRepository.Insert(episodeFile); _messageAggregator.PublishEvent(new EpisodeFileAddedEvent(addedFile)); return addedFile; } public void Update(EpisodeFile episodeFile) { _mediaFileRepository.Update(episodeFile); } public void Delete(EpisodeFile episodeFile) { _mediaFileRepository.Delete(episodeFile); _messageAggregator.PublishEvent(new EpisodeFileDeletedEvent(episodeFile)); } public bool Exists(string path) { return _mediaFileRepository.Exists(path); } public EpisodeFile GetFileByPath(string path) { return _mediaFileRepository.GetFileByPath(path.Normalize()); } public List GetFilesBySeries(int seriesId) { return _mediaFileRepository.GetFilesBySeries(seriesId); } public List FilterExistingFiles(List files, int seriesId) { var seriesFiles = GetFilesBySeries(seriesId); if (!seriesFiles.Any()) return files; return files.Select(f => f.Normalize()).Except(seriesFiles.Select(c => c.Path)).ToList(); } public void HandleAsync(SeriesDeletedEvent message) { var files = GetFilesBySeries(message.Series.Id); _mediaFileRepository.DeleteMany(files); } } }