You've already forked Sonarr
mirror of
https://github.com/Sonarr/Sonarr.git
synced 2025-11-06 09:19:38 +02:00
Added TimerProvider
This commit is contained in:
@@ -48,7 +48,7 @@ namespace NzbDrone.Core.Providers
|
||||
return _repository.Single<IndexerSetting>(s => s.IndexProviderType == type.ToString());
|
||||
}
|
||||
|
||||
public IndexerSetting GetSettings(int id)
|
||||
public virtual IndexerSetting GetSettings(int id)
|
||||
{
|
||||
return _repository.Single<IndexerSetting>(s => s.Id == id);
|
||||
}
|
||||
|
||||
@@ -1,9 +0,0 @@
|
||||
namespace NzbDrone.Core.Providers
|
||||
{
|
||||
public class RssSyncProvider
|
||||
{
|
||||
public virtual void Begin()
|
||||
{
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -51,7 +51,7 @@ namespace NzbDrone.Core.Providers
|
||||
|
||||
XDocument xDoc = XDocument.Parse(response);
|
||||
|
||||
//If an Error Occurred, retuyrn)
|
||||
//If an Error Occurred, return)
|
||||
if (xDoc.Descendants("error").Count() != 0)
|
||||
return false;
|
||||
|
||||
|
||||
@@ -1,130 +0,0 @@
|
||||
using System;
|
||||
using System.Timers;
|
||||
using NLog;
|
||||
|
||||
namespace NzbDrone.Core.Providers
|
||||
{
|
||||
public class TimerProvider
|
||||
{
|
||||
private static readonly Logger Logger = LogManager.GetCurrentClassLogger();
|
||||
private readonly EpisodeProvider _episodeProvider;
|
||||
private readonly MediaFileProvider _mediaFileProvider;
|
||||
|
||||
private readonly Timer _minuteTimer;
|
||||
private readonly RssSyncProvider _rssSyncProvider;
|
||||
private readonly Timer _rssSyncTimer;
|
||||
private readonly SeasonProvider _seasonProvider;
|
||||
private readonly SeriesProvider _seriesProvider;
|
||||
private DateTime _rssSyncNextInterval;
|
||||
|
||||
public TimerProvider(RssSyncProvider rssSyncProvider, SeriesProvider seriesProvider,
|
||||
SeasonProvider seasonProvider, EpisodeProvider episodeProvider,
|
||||
MediaFileProvider mediaFileProvider)
|
||||
{
|
||||
_rssSyncProvider = rssSyncProvider;
|
||||
_seriesProvider = seriesProvider;
|
||||
_seasonProvider = seasonProvider;
|
||||
_episodeProvider = episodeProvider;
|
||||
_mediaFileProvider = mediaFileProvider;
|
||||
|
||||
_rssSyncTimer = new Timer();
|
||||
_minuteTimer = new Timer(60000);
|
||||
}
|
||||
|
||||
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 += 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 += MinuteTimer_Elapsed;
|
||||
_minuteTimer.Start();
|
||||
}
|
||||
|
||||
public virtual void StopMinuteTimer()
|
||||
{
|
||||
_minuteTimer.Stop();
|
||||
}
|
||||
|
||||
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();
|
||||
}
|
||||
}
|
||||
}
|
||||
11
NzbDrone.Core/Providers/Timers/ITimer.cs
Normal file
11
NzbDrone.Core/Providers/Timers/ITimer.cs
Normal file
@@ -0,0 +1,11 @@
|
||||
namespace NzbDrone.Core.Providers.Timers
|
||||
{
|
||||
public interface ITimer
|
||||
{
|
||||
string Name { get; }
|
||||
|
||||
int DefaultInterval { get; }
|
||||
|
||||
void Start();
|
||||
}
|
||||
}
|
||||
39
NzbDrone.Core/Providers/Timers/RssSyncTimer.cs
Normal file
39
NzbDrone.Core/Providers/Timers/RssSyncTimer.cs
Normal file
@@ -0,0 +1,39 @@
|
||||
using System.Linq;
|
||||
using NLog;
|
||||
|
||||
namespace NzbDrone.Core.Providers.Timers
|
||||
{
|
||||
public class RssSyncTimer : ITimer
|
||||
{
|
||||
private readonly IndexerProvider _indexerProvider;
|
||||
|
||||
private static readonly Logger Logger = LogManager.GetCurrentClassLogger();
|
||||
|
||||
public RssSyncTimer(IndexerProvider indexerProvider)
|
||||
{
|
||||
_indexerProvider = indexerProvider;
|
||||
}
|
||||
|
||||
public string Name
|
||||
{
|
||||
get { return "RSS Sync"; }
|
||||
}
|
||||
|
||||
public int DefaultInterval
|
||||
{
|
||||
get { return 15; }
|
||||
}
|
||||
|
||||
public void Start()
|
||||
{
|
||||
Logger.Info("Doing Things!!!!");
|
||||
|
||||
var indexers = _indexerProvider.AllIndexers().Where(c => c.Enable);
|
||||
|
||||
foreach (var indexerSetting in indexers)
|
||||
{
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
123
NzbDrone.Core/Providers/Timers/TimerProvider.cs
Normal file
123
NzbDrone.Core/Providers/Timers/TimerProvider.cs
Normal file
@@ -0,0 +1,123 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Diagnostics;
|
||||
using System.Linq;
|
||||
using NLog;
|
||||
using NzbDrone.Core.Repository;
|
||||
using SubSonic.Repository;
|
||||
|
||||
namespace NzbDrone.Core.Providers.Timers
|
||||
{
|
||||
public class TimerProvider
|
||||
{
|
||||
private static readonly Logger Logger = LogManager.GetCurrentClassLogger();
|
||||
private readonly IRepository _repository;
|
||||
private readonly IEnumerable<ITimer> _timerJobs;
|
||||
|
||||
private static readonly object ExecutionLock = new object();
|
||||
private static bool _isRunning;
|
||||
|
||||
public TimerProvider(IRepository repository, IEnumerable<ITimer> timerJobs)
|
||||
{
|
||||
_repository = repository;
|
||||
_timerJobs = timerJobs;
|
||||
}
|
||||
|
||||
public TimerProvider() { }
|
||||
|
||||
public virtual List<TimerSetting> All()
|
||||
{
|
||||
return _repository.All<TimerSetting>().ToList();
|
||||
}
|
||||
|
||||
public virtual void SaveSettings(TimerSetting settings)
|
||||
{
|
||||
if (settings.Id == 0)
|
||||
{
|
||||
Logger.Debug("Adding timer settings for {0}", settings.Name);
|
||||
_repository.Add(settings);
|
||||
}
|
||||
else
|
||||
{
|
||||
Logger.Debug("Updating timer settings for {0}", settings.Name);
|
||||
_repository.Update(settings);
|
||||
}
|
||||
}
|
||||
|
||||
public virtual void Run()
|
||||
{
|
||||
lock (ExecutionLock)
|
||||
{
|
||||
if (_isRunning)
|
||||
{
|
||||
Logger.Info("Another instance of timer is already running. Ignoring request.");
|
||||
return;
|
||||
}
|
||||
_isRunning = true;
|
||||
}
|
||||
|
||||
Logger.Trace("Getting list of timers needing to be executed");
|
||||
|
||||
var pendingTimers = All().Where(
|
||||
t => t.Enable &&
|
||||
(DateTime.Now - t.LastExecution) > TimeSpan.FromMinutes(t.Interval)
|
||||
);
|
||||
|
||||
foreach (var pendingTimer in pendingTimers)
|
||||
{
|
||||
Logger.Info("Attempting to start timer [{0}]. Last executing {1}", pendingTimer.Name, pendingTimer.LastExecution);
|
||||
var timerClass = _timerJobs.Where(t => t.GetType().ToString() == pendingTimer.TypeName).FirstOrDefault();
|
||||
ForceExecute(timerClass.GetType());
|
||||
}
|
||||
}
|
||||
|
||||
public void ForceExecute(Type timerType)
|
||||
{
|
||||
var timerClass = _timerJobs.Where(t => t.GetType() == timerType).FirstOrDefault();
|
||||
if (timerClass == null)
|
||||
{
|
||||
Logger.Error("Unable to locate implantation for [{0}]. Make sure its properly registered.", timerType.ToString());
|
||||
return;
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
var sw = Stopwatch.StartNew();
|
||||
timerClass.Start();
|
||||
sw.Stop();
|
||||
Logger.Info("timer [{0}] finished executing successfully. Duration {1}", timerClass.Name, sw.Elapsed.ToString());
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
Logger.Error("An error has occurred while executing timer job " + timerClass.Name, e);
|
||||
}
|
||||
}
|
||||
|
||||
public virtual void Initialize()
|
||||
{
|
||||
Logger.Info("Initializing timer jobs. Count {0}", _timerJobs.Count());
|
||||
var currentTimer = All();
|
||||
|
||||
foreach (var timer in _timerJobs)
|
||||
{
|
||||
var timerProviderLocal = timer;
|
||||
if (!currentTimer.Exists(c => c.TypeName == timerProviderLocal.GetType().ToString()))
|
||||
{
|
||||
var settings = new TimerSetting()
|
||||
{
|
||||
Enable = true,
|
||||
TypeName = timer.GetType().ToString(),
|
||||
Name = timerProviderLocal.Name,
|
||||
Interval = timerProviderLocal.DefaultInterval,
|
||||
LastExecution = DateTime.MinValue
|
||||
|
||||
};
|
||||
|
||||
SaveSettings(settings);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
@@ -23,13 +23,13 @@ namespace NzbDrone.Core.Providers
|
||||
public virtual void Notify(string header, string message)
|
||||
{
|
||||
//Get time in seconds and convert to ms
|
||||
var time = Convert.ToInt32(_configProvider.GetValue("XbmcDisplayTime", "3", true))*1000;
|
||||
var time = Convert.ToInt32(_configProvider.GetValue("XbmcDisplayTime", "3", true)) * 1000;
|
||||
var command = String.Format("ExecBuiltIn(Notification({0},{1},{2}))", header, message, time);
|
||||
|
||||
if (Convert.ToBoolean(_configProvider.GetValue("XbmcNotificationImage", false, true)))
|
||||
{
|
||||
//Todo: Get the actual port that NzbDrone is running on...
|
||||
var serverInfo = String.Format("http://{0}:{1}", ServerHelper.GetServerHostname(), "8989");
|
||||
var serverInfo = String.Format("http://{0}:{1}", Environment.MachineName, "8989");
|
||||
|
||||
var imageUrl = String.Format("{0}/Content/XbmcNotification.png", serverInfo);
|
||||
command = String.Format("ExecBuiltIn(Notification({0},{1},{2}, {3}))", header, message, time, imageUrl);
|
||||
|
||||
Reference in New Issue
Block a user