2011-01-31 09:42:44 +02:00
using System ;
using System.Collections.Generic ;
using System.Linq ;
using System.Text ;
using System.Timers ;
2011-02-09 03:23:01 +02:00
using NLog ;
2011-01-31 09:42:44 +02:00
using NzbDrone.Core.Model.Notification ;
namespace NzbDrone.Core.Providers
{
public class TimerProvider : ITimerProvider
{
2011-02-25 03:18:22 +02:00
private readonly IRssSyncProvider _rssSyncProvider ;
private readonly ISeriesProvider _seriesProvider ;
private readonly ISeasonProvider _seasonProvider ;
private readonly IEpisodeProvider _episodeProvider ;
private readonly IMediaFileProvider _mediaFileProvider ;
2011-02-10 08:51:04 +02:00
private Timer _rssSyncTimer ;
private Timer _minuteTimer ;
2011-02-09 03:23:01 +02:00
private DateTime _rssSyncNextInterval ;
2011-02-10 09:18:07 +02:00
private static readonly Logger Logger = LogManager . GetCurrentClassLogger ( ) ;
2011-02-09 03:23:01 +02:00
2011-02-25 03:18:22 +02:00
public TimerProvider ( IRssSyncProvider rssSyncProvider , ISeriesProvider seriesProvider , ISeasonProvider seasonProvider , IEpisodeProvider episodeProvider , IMediaFileProvider mediaFileProvider )
2011-02-09 03:23:01 +02:00
{
_rssSyncProvider = rssSyncProvider ;
2011-02-10 08:51:04 +02:00
_seriesProvider = seriesProvider ;
_seasonProvider = seasonProvider ;
_episodeProvider = episodeProvider ;
2011-02-25 03:18:22 +02:00
_mediaFileProvider = mediaFileProvider ;
2011-02-10 08:51:04 +02:00
_rssSyncTimer = new Timer ( ) ;
_minuteTimer = new Timer ( 60000 ) ;
2011-02-09 03:23:01 +02:00
}
2011-01-31 09:42:44 +02:00
#region ITimerProvider Members
2011-02-09 03:23:01 +02:00
public void ResetRssSyncTimer ( )
{
double interval = _rssSyncTimer . Interval ;
2011-02-16 06:44:19 +02:00
_rssSyncTimer . Interval = interval ;
2011-02-09 03:23:01 +02:00
}
2011-02-10 08:51:04 +02:00
2011-02-09 03:23:01 +02:00
public void StartRssSyncTimer ( )
{
2011-02-10 08:51:04 +02:00
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)
2011-02-09 03:23:01 +02:00
{
Logger . Error ( "RSS Sync Frequency is invalid, please set the interval first" ) ;
throw new InvalidOperationException ( "RSS Sync Frequency Invalid" ) ;
}
2011-02-16 06:44:19 +02:00
_rssSyncTimer . Elapsed + = new ElapsedEventHandler ( RunRssSync ) ;
2011-02-09 03:23:01 +02:00
_rssSyncTimer . Start ( ) ;
_rssSyncNextInterval = DateTime . Now . AddMilliseconds ( _rssSyncTimer . Interval ) ;
}
public void StopRssSyncTimer ( )
{
_rssSyncTimer . Stop ( ) ;
}
public void SetRssSyncTimer ( int minutes )
2011-01-31 09:42:44 +02:00
{
2011-02-16 06:44:19 +02:00
long ms = minutes * 60 * 1000 ;
2011-02-09 03:23:01 +02:00
_rssSyncTimer . Interval = ms ;
2011-01-31 09:42:44 +02:00
}
2011-02-09 03:23:01 +02:00
public TimeSpan RssSyncTimeLeft ( )
2011-01-31 09:42:44 +02:00
{
2011-02-09 03:23:01 +02:00
return _rssSyncNextInterval . Subtract ( DateTime . Now ) ;
2011-01-31 09:42:44 +02:00
}
2011-02-09 03:23:01 +02:00
public DateTime NextRssSyncTime ( )
2011-01-31 09:42:44 +02:00
{
2011-02-09 03:23:01 +02:00
return _rssSyncNextInterval ;
2011-01-31 09:42:44 +02:00
}
2011-02-10 08:51:04 +02:00
public void StartMinuteTimer ( )
{
_minuteTimer . Elapsed + = new ElapsedEventHandler ( MinuteTimer_Elapsed ) ;
_minuteTimer . Start ( ) ;
}
public void StopMinuteTimer ( )
{
_minuteTimer . Stop ( ) ;
}
2011-01-31 09:42:44 +02:00
#endregion
2011-02-10 08:51:04 +02:00
private void RunRssSync ( object obj , ElapsedEventArgs args )
2011-02-09 03:23:01 +02:00
{
2011-02-10 09:18:07 +02:00
_rssSyncNextInterval = DateTime . Now . AddMilliseconds ( _rssSyncTimer . Interval ) ;
2011-02-16 06:44:19 +02:00
_rssSyncProvider . Begin ( ) ;
2011-02-09 03:23:01 +02:00
}
2011-02-10 08:51:04 +02:00
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 ) ;
}
}
2011-02-25 03:18:22 +02:00
//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 ) ;
}
}
2011-02-10 08:51:04 +02:00
throw new NotImplementedException ( ) ;
}
2011-01-31 09:42:44 +02:00
}
}