using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Timers; using NLog; using NzbDrone.Core.Model.Notification; namespace NzbDrone.Core.Providers { public class TimerProvider { private readonly RssSyncProvider _rssSyncProvider; private readonly SeriesProvider _seriesProvider; private readonly ISeasonProvider _seasonProvider; private readonly EpisodeProvider _episodeProvider; private readonly IMediaFileProvider _mediaFileProvider; private Timer _rssSyncTimer; private Timer _minuteTimer; private DateTime _rssSyncNextInterval; private static readonly Logger Logger = LogManager.GetCurrentClassLogger(); public TimerProvider(RssSyncProvider rssSyncProvider, SeriesProvider seriesProvider, ISeasonProvider seasonProvider, EpisodeProvider episodeProvider, IMediaFileProvider mediaFileProvider) { _rssSyncProvider = rssSyncProvider; _seriesProvider = seriesProvider; _seasonProvider = seasonProvider; _episodeProvider = episodeProvider; _mediaFileProvider = mediaFileProvider; _rssSyncTimer = new Timer(); _minuteTimer = new Timer(60000); } #region TimerProvider Members public virtual void ResetRssSyncTimer() { double interval = _rssSyncTimer.Interval; _rssSyncTimer.Interval = interval; } public virtual void StartRssSyncTimer() { if (_rssSyncTimer.Interval < 900000) //If Timer is less than 15 minutes, throw an error! This should also be handled when saving the config, though a user could by-pass it by editing the DB directly... TNO (Trust No One) { Logger.Error("RSS Sync Frequency is invalid, please set the interval first"); throw new InvalidOperationException("RSS Sync Frequency Invalid"); } _rssSyncTimer.Elapsed += new ElapsedEventHandler(RunRssSync); _rssSyncTimer.Start(); _rssSyncNextInterval = DateTime.Now.AddMilliseconds(_rssSyncTimer.Interval); } public virtual void StopRssSyncTimer() { _rssSyncTimer.Stop(); } public virtual void SetRssSyncTimer(int minutes) { long ms = minutes * 60 * 1000; _rssSyncTimer.Interval = ms; } public virtual TimeSpan RssSyncTimeLeft() { return _rssSyncNextInterval.Subtract(DateTime.Now); } public virtual DateTime NextRssSyncTime() { return _rssSyncNextInterval; } public virtual void StartMinuteTimer() { _minuteTimer.Elapsed += new ElapsedEventHandler(MinuteTimer_Elapsed); _minuteTimer.Start(); } public virtual void StopMinuteTimer() { _minuteTimer.Stop(); } #endregion private void RunRssSync(object obj, ElapsedEventArgs args) { _rssSyncNextInterval = DateTime.Now.AddMilliseconds(_rssSyncTimer.Interval); _rssSyncProvider.Begin(); } private void MinuteTimer_Elapsed(object obj, ElapsedEventArgs args) { //Check to see if anything should be run at this time, if so run it var now = DateTime.Now; //Daily (Except Sunday) 03:00 - Update the lastest season for all TV Shows if (now.Hour == 3 && now.Minute == 0 && now.DayOfWeek != DayOfWeek.Sunday) { foreach (var series in _seriesProvider.GetAllSeries()) { var season = _seasonProvider.GetLatestSeason(series.SeriesId); _episodeProvider.RefreshEpisodeInfo(season); } } //Sunday 03:00 - Update all TV Shows if (now.Hour == 3 && now.Minute == 0 && now.DayOfWeek == DayOfWeek.Sunday) { foreach (var series in _seriesProvider.GetAllSeries()) { _episodeProvider.RefreshEpisodeInfo(series.SeriesId); } } //Daily 00:00 (Midnight) - Cleanup (removed) EpisodeFiles + Scan for New EpisodeFiles if (now.Hour == 0 && now.Minute == 0) { foreach (var series in _seriesProvider.GetAllSeries()) { _mediaFileProvider.CleanUp(series.EpisodeFiles); _mediaFileProvider.Scan(series); } } throw new NotImplementedException(); } } }