diff --git a/NzbDrone.Core/Providers/EpisodeProvider.cs b/NzbDrone.Core/Providers/EpisodeProvider.cs index e33400335..0b26c20b3 100644 --- a/NzbDrone.Core/Providers/EpisodeProvider.cs +++ b/NzbDrone.Core/Providers/EpisodeProvider.cs @@ -171,6 +171,65 @@ namespace NzbDrone.Core.Providers Logger.Debug("Finished episode refresh for series:{0}. Successful:{1} - Failed:{2} ", targetSeries.SeriesName, successCount, failCount); } + public void RefreshEpisodeInfo(Season season) + { + Logger.Info("Starting episode info refresh for season {0} of series:{1}", season.SeasonNumber, season.SeriesId); + int successCount = 0; + int failCount = 0; + var targetSeries = _tvDb.GetSeries(season.SeriesId, true); + + var updateList = new List(); + var newList = new List(); + + foreach (var episode in targetSeries.Episodes.Where(e => e.SeasonId == season.SeasonId)) + { + try + { + //DateTime throws an error in SQLServer per message below: + //SqlDateTime overflow. Must be between 1/1/1753 12:00:00 AM and 12/31/9999 11:59:59 PM. + //So lets hack it so it works for SQLServer (as well as SQLite), perhaps we can find a better solution + //Todo: Fix this hack + if (episode.FirstAired < new DateTime(1753, 1, 1)) + episode.FirstAired = new DateTime(1753, 1, 1); + + Logger.Trace("Updating info for series:{0} - episode:{1}", targetSeries.SeriesName, episode.EpisodeNumber); + var newEpisode = new Episode() + { + AirDate = episode.FirstAired, + EpisodeId = episode.Id, + EpisodeNumber = episode.EpisodeNumber, + Language = episode.Language.Abbriviation, + Overview = episode.Overview, + SeasonId = episode.SeasonId, + SeasonNumber = episode.SeasonNumber, + SeriesId = season.SeriesId, + Title = episode.EpisodeName + }; + + if (_sonicRepo.Exists(e => e.EpisodeId == newEpisode.EpisodeId)) + { + updateList.Add(newEpisode); + } + else + { + newList.Add(newEpisode); + } + + successCount++; + } + catch (Exception e) + { + Logger.FatalException(String.Format("An error has occurred while updating episode info for season {0} of series {1}", season.SeasonNumber, season.SeriesId), e); + failCount++; + } + } + + _sonicRepo.AddMany(newList); + _sonicRepo.UpdateMany(updateList); + + Logger.Debug("Finished episode refresh for series:{0}. Successful:{1} - Failed:{2} ", targetSeries.SeriesName, successCount, failCount); + } + private bool IsSeasonIgnored(EpisodeModel episode) { //Check if this Season is ignored diff --git a/NzbDrone.Core/Providers/IEpisodeProvider.cs b/NzbDrone.Core/Providers/IEpisodeProvider.cs index 30f3054d1..77b193184 100644 --- a/NzbDrone.Core/Providers/IEpisodeProvider.cs +++ b/NzbDrone.Core/Providers/IEpisodeProvider.cs @@ -20,6 +20,7 @@ namespace NzbDrone.Core.Providers bool IsNeeded(EpisodeModel episode); void RefreshEpisodeInfo(int seriesId); + void RefreshEpisodeInfo(Season season); IList GetEpisodeBySeason(long seasonId); } } \ No newline at end of file