diff --git a/data/interfaces/default/queue_modal.html b/data/interfaces/default/queue_modal.html
index dd97ccb3..91bead00 100644
--- a/data/interfaces/default/queue_modal.html
+++ b/data/interfaces/default/queue_modal.html
@@ -1,7 +1,7 @@
<%
import datetime
- from plexpy import helpers
- from plexpy.activity_handler import ACTIVITY_SCHED, schedule_callback
+ import plexpy
+ from plexpy import activity_handler, helpers
if queue == 'active sessions':
filter_key = 'session_key-'
@@ -14,7 +14,7 @@
title_key = title_format.format('Rating Key', 'Title')
description = 'Queue to flush recently added items to the database and send notifications if enabled.'
- scheduled_jobs = [j.id for j in ACTIVITY_SCHED.get_jobs() if j.id.startswith(filter_key)]
+ scheduled_jobs = [j.id for j in activity_handler.ACTIVITY_SCHED.get_jobs() if j.id.startswith(filter_key)]
%>
@@ -44,13 +44,13 @@
% if scheduled_jobs:
% for job in scheduled_jobs:
<%
- sched_job = ACTIVITY_SCHED.get_job(job)
+ sched_job = activity_handler.ACTIVITY_SCHED.get_job(job)
now = datetime.datetime.now(sched_job.next_run_time.tzinfo)
%>
${title_format.format(*sched_job.args)} |
${helpers.format_timedelta_Hms(sched_job.next_run_time - now)} |
- ${sched_job.next_run_time.strftime('%Y-%m-%d %H:%M:%S')} |
+ ${sched_job.next_run_time.astimezone(plexpy.SYS_TIMEZONE).strftime('%Y-%m-%d %H:%M:%S')} |
% endfor
% else:
diff --git a/data/interfaces/default/scheduler_table.html b/data/interfaces/default/scheduler_table.html
index dc66ebb7..7cfe3cf3 100644
--- a/data/interfaces/default/scheduler_table.html
+++ b/data/interfaces/default/scheduler_table.html
@@ -39,7 +39,7 @@ DOCUMENTATION :: END
Active |
${helpers.format_timedelta_Hms(sched_job.trigger.interval)} |
${helpers.format_timedelta_Hms(sched_job.next_run_time - now)} |
- ${sched_job.next_run_time.strftime('%Y-%m-%d %H:%M:%S')} |
+ ${sched_job.next_run_time.astimezone(plexpy.SYS_TIMEZONE).strftime('%Y-%m-%d %H:%M:%S')} |
% elif job in ('Check for server response', 'Check for active sessions', 'Check for recently added items') and plexpy.WS_CONNECTED:
diff --git a/plexpy/__init__.py b/plexpy/__init__.py
index f6e12d16..c3bdb737 100644
--- a/plexpy/__init__.py
+++ b/plexpy/__init__.py
@@ -71,7 +71,7 @@ PIDFILE = None
NOFORK = False
DOCKER = False
-SCHED = BackgroundScheduler()
+SCHED = None
SCHED_LOCK = threading.Lock()
NOTIFY_QUEUE = Queue()
@@ -509,11 +509,11 @@ def schedule_job(func, name, hours=0, minutes=0, seconds=0, args=None):
logger.info(u"Removed background task: %s", name)
elif job.trigger.interval != datetime.timedelta(hours=hours, minutes=minutes):
SCHED.reschedule_job(name, trigger=IntervalTrigger(
- hours=hours, minutes=minutes, seconds=seconds), args=args)
+ hours=hours, minutes=minutes, seconds=seconds, timezone=pytz.UTC), args=args)
logger.info(u"Re-scheduled background task: %s", name)
elif hours > 0 or minutes > 0 or seconds > 0:
SCHED.add_job(func, id=name, trigger=IntervalTrigger(
- hours=hours, minutes=minutes, seconds=seconds), args=args)
+ hours=hours, minutes=minutes, seconds=seconds, timezone=pytz.UTC), args=args)
logger.info(u"Scheduled background task: %s", name)
@@ -521,6 +521,11 @@ def start():
global _STARTED
if _INITIALIZED:
+ global SCHED
+ SCHED = BackgroundScheduler(timezone=pytz.UTC)
+ activity_handler.ACTIVITY_SCHED = BackgroundScheduler(timezone=pytz.UTC)
+ newsletter_handler.NEWSLETTER_SCHED = BackgroundScheduler(timezone=pytz.UTC)
+
# Start the scheduler for stale stream callbacks
activity_handler.ACTIVITY_SCHED.start()
diff --git a/plexpy/activity_handler.py b/plexpy/activity_handler.py
index 16ec3b24..b65ebff6 100644
--- a/plexpy/activity_handler.py
+++ b/plexpy/activity_handler.py
@@ -17,8 +17,8 @@ import datetime
import os
import time
-from apscheduler.schedulers.background import BackgroundScheduler
from apscheduler.triggers.date import DateTrigger
+import pytz
import plexpy
import activity_processor
@@ -29,7 +29,7 @@ import notification_handler
import pmsconnect
-ACTIVITY_SCHED = BackgroundScheduler()
+ACTIVITY_SCHED = None
RECENTLY_ADDED_QUEUE = {}
@@ -488,11 +488,13 @@ def schedule_callback(id, func=None, remove_job=False, args=None, **kwargs):
else:
ACTIVITY_SCHED.reschedule_job(
id, args=args, trigger=DateTrigger(
- run_date=datetime.datetime.now() + datetime.timedelta(**kwargs)))
+ run_date=datetime.datetime.now(pytz.UTC) + datetime.timedelta(**kwargs),
+ timezone=pytz.UTC))
elif not remove_job:
ACTIVITY_SCHED.add_job(
func, args=args, id=id, trigger=DateTrigger(
- run_date=datetime.datetime.now() + datetime.timedelta(**kwargs)))
+ run_date=datetime.datetime.now(pytz.UTC) + datetime.timedelta(**kwargs),
+ timezone=pytz.UTC))
def force_stop_stream(session_key, title, user):
diff --git a/plexpy/newsletter_handler.py b/plexpy/newsletter_handler.py
index 11683457..1b197b01 100644
--- a/plexpy/newsletter_handler.py
+++ b/plexpy/newsletter_handler.py
@@ -16,7 +16,6 @@
import os
import time
-from apscheduler.schedulers.background import BackgroundScheduler
from apscheduler.triggers.cron import CronTrigger
import email.utils
@@ -26,7 +25,7 @@ import logger
import newsletters
-NEWSLETTER_SCHED = BackgroundScheduler()
+NEWSLETTER_SCHED = None
def add_newsletter_each(newsletter_id=None, notify_action=None, **kwargs):
@@ -62,11 +61,13 @@ def schedule_newsletter_job(newsletter_job_id, name='', func=None, remove_job=Fa
logger.info(u"Tautulli NewsletterHandler :: Removed scheduled newsletter: %s" % name)
else:
NEWSLETTER_SCHED.reschedule_job(
- newsletter_job_id, args=args, trigger=CronTrigger().from_crontab(cron))
+ newsletter_job_id, args=args, trigger=CronTrigger().from_crontab(
+ cron, timezone=plexpy.SYS_TIMEZONE))
logger.info(u"Tautulli NewsletterHandler :: Re-scheduled newsletter: %s" % name)
elif not remove_job:
NEWSLETTER_SCHED.add_job(
- func, args=args, id=newsletter_job_id, trigger=CronTrigger.from_crontab(cron))
+ func, args=args, id=newsletter_job_id, trigger=CronTrigger().from_crontab(
+ cron, timezone=plexpy.SYS_TIMEZONE))
logger.info(u"Tautulli NewsletterHandler :: Scheduled newsletter: %s" % name)