diff --git a/resources/lib/utils.py b/resources/lib/utils.py index aa94723..652bb76 100644 --- a/resources/lib/utils.py +++ b/resources/lib/utils.py @@ -4,7 +4,9 @@ import xbmcaddon __addon_id__= 'script.xbmcbackup' __Addon = xbmcaddon.Addon(__addon_id__) -#global functions for logging and encoding +def data_dir(): + return __Addon.getAddonInfo('profile') + def log(message,loglevel=xbmc.LOGNOTICE): xbmc.log(encode(__addon_id__ + ": " + message),level=loglevel) diff --git a/scheduler.py b/scheduler.py index d453328..04e821f 100644 --- a/scheduler.py +++ b/scheduler.py @@ -1,6 +1,7 @@ import xbmc import datetime import time +import os import resources.lib.utils as utils from resources.lib.croniter import croniter from resources.lib.backup import XbmcBackup @@ -8,6 +9,7 @@ from resources.lib.backup import XbmcBackup class BackupScheduler: enabled = "false" next_run = 0 + settings_update_time = 0 def __init__(self): self.enabled = utils.getSetting("enable_scheduler") @@ -18,12 +20,22 @@ class BackupScheduler: def setup(self): #scheduler was turned on, find next run time utils.log("scheduler enabled, finding next run time") - self.findNextRun(time.time()) + self.findNextRun(time.time(),True) utils.log("scheduler will run again on " + datetime.datetime.fromtimestamp(self.next_run).strftime('%m-%d-%Y %H:%M')) def start(self): while(not xbmc.abortRequested): - if(self.enabled == "true"): + current_enabled = utils.getSetting("enable_scheduler") + + if(current_enabled == "true" and self.enabled == "false"): + #scheduler was just turned on + self.enabled = current_enabled + self.setup() + elif (current_enabled == "false" and self.enabled == "true"): + #schedule was turn off + self.enabled = current_enabled + elif(self.enabled == "true"): + #scheduler is still on now = time.time() if(self.next_run <= now): @@ -34,24 +46,32 @@ class BackupScheduler: backup.run(XbmcBackup.Backup,True) self.findNextRun(now) - else: - self.enabled = utils.getSetting("enable_scheduler") - if(self.enabled == "true"): - self.setup() - time.sleep(10) - def findNextRun(self,now): - #find the cron expression and get the next run time - cron_exp = self.parseSchedule() + def findNextRun(self,now,forceUpdate = False): + mod_time = self.settings_update_time + + #check if the schedule has been modified + try: + #get the last modified time of the file + mod_time = os.path.getmtime(xbmc.translatePath(utils.data_dir()) + "settings.xml") + except: + #don't do anything here + mod_time = self.settings_update_time - cron_ob = croniter(cron_exp,datetime.datetime.fromtimestamp(now)) - new_run_time = cron_ob.get_next(float) + if(mod_time > self.settings_update_time or forceUpdate): + self.settings_update_time = mod_time + + #find the cron expression and get the next run time + cron_exp = self.parseSchedule() - if(new_run_time != self.next_run): - self.next_run = new_run_time - utils.log("scheduler will run again on " + datetime.datetime.fromtimestamp(self.next_run).strftime('%m-%d-%Y %H:%M')) + cron_ob = croniter(cron_exp,datetime.datetime.fromtimestamp(now)) + new_run_time = cron_ob.get_next(float) + + if(new_run_time != self.next_run): + self.next_run = new_run_time + utils.log("scheduler will run again on " + datetime.datetime.fromtimestamp(self.next_run).strftime('%m-%d-%Y %H:%M')) def parseSchedule(self): schedule_type = int(utils.getSetting("schedule_interval"))