using System.Collections.Generic; using System.Linq; using NLog; using NzbDrone.Common.Eventing; using NzbDrone.Core.Tv.Events; namespace NzbDrone.Core.Tv { public interface ISeasonService { void SetIgnore(int seriesId, int seasonNumber, bool isIgnored); List GetSeasonsBySeries(int seriesId); } public class SeasonService : ISeasonService, IHandle, IHandle, IHandleAsync { private readonly ISeasonRepository _seasonRepository; private readonly Logger _logger; public SeasonService(ISeasonRepository seasonRepository, Logger logger) { _seasonRepository = seasonRepository; _logger = logger; } public void SetIgnore(int seriesId, int seasonNumber, bool isIgnored) { var season = _seasonRepository.Get(seriesId, seasonNumber); _logger.Trace("Setting ignore flag on Series:{0} Season:{1} to {2}", seriesId, seasonNumber, isIgnored); season.Ignored = isIgnored; season.Episodes.ForEach(e => e.Ignored = isIgnored); _seasonRepository.Update(season); _logger.Info("Ignore flag for Series:{0} Season:{1} successfully set to {2}", seriesId, seasonNumber, isIgnored); } public List GetSeasonsBySeries(int seriesId) { return _seasonRepository.GetSeasonBySeries(seriesId); } public void Handle(EpisodeInfoAddedEvent message) { EnsureSeasons(message.Episodes); } public void Handle(EpisodeInfoUpdatedEvent message) { EnsureSeasons(message.Episodes); } private void EnsureSeasons(IEnumerable episodes) { var seriesGroup = episodes.GroupBy(c => c.SeriesId); foreach (var group in seriesGroup) { var seriesId = group.Key; var existingSeasons = _seasonRepository.GetSeasonNumbers(seriesId); var seasonNumbers = group.Select(c => c.SeasonNumber).Distinct(); var missingSeasons = seasonNumbers.Where(seasonNumber => !existingSeasons.Contains(seasonNumber)); var seasonToAdd = missingSeasons.Select(c => new Season() { SeriesId = seriesId, SeasonNumber = c, Ignored = false }); _seasonRepository.InsertMany(seasonToAdd.ToList()); } } public void HandleAsync(SeriesDeletedEvent message) { var seasons = GetSeasonsBySeries(message.Series.Id); _seasonRepository.DeleteMany(seasons); } } }