You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
Lidarr/src/NzbDrone.Core/Tv/SeriesScannedHandler.cs

103 lines
3.4 KiB

using System;
using System.Collections.Generic;
using System.Linq;
using NLog;
using NzbDrone.Common.Extensions;
using NzbDrone.Core.IndexerSearch;
using NzbDrone.Core.MediaFiles.Events;
using NzbDrone.Core.Messaging.Commands;
using NzbDrone.Core.Messaging.Events;
namespace NzbDrone.Core.Tv
{
public class SeriesScannedHandler : IHandle<SeriesScannedEvent>,
IHandle<SeriesScanSkippedEvent>
{
private readonly ISeriesService _seriesService;
private readonly IEpisodeService _episodeService;
private readonly IManageCommandQueue _commandQueueManager;
private readonly Logger _logger;
public SeriesScannedHandler(ISeriesService seriesService,
IEpisodeService episodeService,
IManageCommandQueue commandQueueManager,
Logger logger)
{
_seriesService = seriesService;
_episodeService = episodeService;
_commandQueueManager = commandQueueManager;
_logger = logger;
}
private void SetEpisodeMonitoredStatus(Series series, List<Episode> episodes)
{
_logger.Debug("[{0}] Setting episode monitored status.", series.Title);
if (series.AddOptions.IgnoreEpisodesWithFiles)
{
_logger.Debug("Ignoring Episodes with Files");
UnmonitorEpisodes(episodes.Where(e => e.HasFile));
}
if (series.AddOptions.IgnoreEpisodesWithoutFiles)
{
_logger.Debug("Ignoring Episodes without Files");
UnmonitorEpisodes(episodes.Where(e => !e.HasFile && e.AirDateUtc.HasValue && e.AirDateUtc.Value.Before(DateTime.UtcNow)));
}
var lastSeason = series.Seasons.Select(s => s.SeasonNumber).MaxOrDefault();
foreach (var season in series.Seasons.Where(s => s.SeasonNumber < lastSeason))
{
if (episodes.Where(e => e.SeasonNumber == season.SeasonNumber).All(e => !e.Monitored))
{
season.Monitored = false;
}
}
_seriesService.UpdateSeries(series);
_episodeService.UpdateEpisodes(episodes);
}
private void UnmonitorEpisodes(IEnumerable<Episode> episodes)
{
foreach (var episode in episodes)
{
episode.Monitored = false;
}
}
private void HandleScanEvents(Series series)
{
if (series.AddOptions == null)
{
return;
}
_logger.Info("[{0}] was recently added, performing post-add actions", series.Title);
var episodes = _episodeService.GetEpisodeBySeries(series.Id);
SetEpisodeMonitoredStatus(series, episodes);
if (series.AddOptions.SearchForMissingEpisodes)
{
_commandQueueManager.Push(new MissingEpisodeSearchCommand(series.Id));
}
series.AddOptions = null;
_seriesService.RemoveAddOptions(series);
}
public void Handle(SeriesScannedEvent message)
{
HandleScanEvents(message.Series);
}
public void Handle(SeriesScanSkippedEvent message)
{
HandleScanEvents(message.Series);
}
}
}