Radarr/NzbDrone.Core/Tv/RefreshSeriesService.cs

129 lines
4.6 KiB
C#
Raw Normal View History

2013-06-02 19:29:00 +00:00
using System;
2013-09-10 05:22:38 +00:00
using System.Collections.Generic;
2013-08-20 15:35:39 +00:00
using System.IO;
2013-06-02 19:29:00 +00:00
using System.Linq;
using NLog;
using NzbDrone.Core.DataAugmentation.DailySeries;
2013-09-11 06:33:47 +00:00
using NzbDrone.Core.Instrumentation;
using NzbDrone.Core.Messaging;
2013-06-02 19:29:00 +00:00
using NzbDrone.Core.MetadataSource;
2013-06-03 05:39:42 +00:00
using NzbDrone.Core.Tv.Commands;
2013-06-02 19:29:00 +00:00
using NzbDrone.Core.Tv.Events;
2013-06-03 05:51:16 +00:00
using NzbDrone.Common;
2013-06-02 19:29:00 +00:00
namespace NzbDrone.Core.Tv
{
public class RefreshSeriesService : IExecute<RefreshSeriesCommand>, IHandleAsync<SeriesAddedEvent>
{
private readonly IProvideSeriesInfo _seriesInfo;
private readonly ISeriesService _seriesService;
2013-08-01 02:02:36 +00:00
private readonly IRefreshEpisodeService _refreshEpisodeService;
2013-06-02 19:29:00 +00:00
private readonly IMessageAggregator _messageAggregator;
private readonly IDailySeriesService _dailySeriesService;
2013-06-02 19:29:00 +00:00
private readonly Logger _logger;
2013-08-01 02:02:36 +00:00
public RefreshSeriesService(IProvideSeriesInfo seriesInfo, ISeriesService seriesService, IRefreshEpisodeService refreshEpisodeService, IMessageAggregator messageAggregator, IDailySeriesService dailySeriesService, Logger logger)
2013-06-02 19:29:00 +00:00
{
_seriesInfo = seriesInfo;
_seriesService = seriesService;
2013-08-01 02:02:36 +00:00
_refreshEpisodeService = refreshEpisodeService;
2013-06-02 19:29:00 +00:00
_messageAggregator = messageAggregator;
_dailySeriesService = dailySeriesService;
2013-06-02 19:29:00 +00:00
_logger = logger;
}
2013-06-03 05:39:42 +00:00
private void RefreshSeriesInfo(Series series)
2013-06-02 19:29:00 +00:00
{
2013-09-11 06:33:47 +00:00
_logger.ProgressInfo("Updating Info for {0}", series.Title);
2013-06-02 19:29:00 +00:00
var tuple = _seriesInfo.GetSeriesInfo(series.TvdbId);
var seriesInfo = tuple.Item1;
series.Title = seriesInfo.Title;
series.AirTime = seriesInfo.AirTime;
series.Overview = seriesInfo.Overview;
series.Status = seriesInfo.Status;
2013-08-01 02:02:36 +00:00
series.CleanTitle = seriesInfo.CleanTitle;
2013-06-03 05:39:42 +00:00
series.LastInfoSync = DateTime.UtcNow;
2013-06-02 19:29:00 +00:00
series.Runtime = seriesInfo.Runtime;
series.Images = seriesInfo.Images;
series.Network = seriesInfo.Network;
series.FirstAired = seriesInfo.FirstAired;
if (_dailySeriesService.IsDailySeries(series.TvdbId))
{
series.SeriesType = SeriesTypes.Daily;
}
2013-08-20 15:35:39 +00:00
try
{
series.Path = new DirectoryInfo(series.Path).FullName;
series.Path = series.Path.GetActualCasing();
}
catch (Exception e)
{
_logger.WarnException("Couldn't update series path for " + series.Path, e);
}
2013-09-10 05:22:38 +00:00
series.Seasons = UpdateSeasons(series, seriesInfo);
2013-06-02 19:29:00 +00:00
_seriesService.UpdateSeries(series);
2013-08-01 02:02:36 +00:00
_refreshEpisodeService.RefreshEpisodeInfo(series, tuple.Item2);
2013-06-02 19:29:00 +00:00
2013-09-11 06:33:47 +00:00
_logger.Debug("Finished series refresh for {0}", series.Title);
2013-06-02 19:29:00 +00:00
_messageAggregator.PublishEvent(new SeriesUpdatedEvent(series));
}
2013-09-10 05:22:38 +00:00
private List<Season> UpdateSeasons(Series series, Series seriesInfo)
{
foreach (var season in seriesInfo.Seasons)
{
var existingSeason = series.Seasons.SingleOrDefault(s => s.SeasonNumber == season.SeasonNumber);
//Todo: Should this should use the previous season's monitored state?
if (existingSeason == null)
{
_logger.Trace("New season ({0}) for series: [{1}] {2}, setting monitored to true", season.SeasonNumber, series.TvdbId, series.Title);
season.Monitored = true;
}
else
2013-09-10 05:22:38 +00:00
{
season.Monitored = existingSeason.Monitored;
}
}
return seriesInfo.Seasons;
}
public void Execute(RefreshSeriesCommand message)
{
if (message.SeriesId.HasValue)
{
var series = _seriesService.GetSeries(message.SeriesId.Value);
RefreshSeriesInfo(series);
}
else
{
var allSeries = _seriesService.GetAllSeries().OrderBy(c => c.LastInfoSync).ToList();
foreach (var series in allSeries)
{
try
{
RefreshSeriesInfo(series);
}
catch (Exception e)
{
_logger.ErrorException("Couldn't refresh info for {0}".Inject(series), e);
}
}
}
}
public void HandleAsync(SeriesAddedEvent message)
{
RefreshSeriesInfo(message.Series);
}
2013-06-02 19:29:00 +00:00
}
}