diff --git a/data/interfaces/default/config.html b/data/interfaces/default/config.html
index 6131d9b4..3b72169d 100644
--- a/data/interfaces/default/config.html
+++ b/data/interfaces/default/config.html
@@ -138,7 +138,7 @@
- Web Interface changes require a restart to take effect. Saving settings will restart intervals.
+ Web Interface changes require a restart to take effect. Saving settings will restart intervals if changed.
diff --git a/headphones/__init__.py b/headphones/__init__.py
index 0ef4adcc..c6258cee 100644
--- a/headphones/__init__.py
+++ b/headphones/__init__.py
@@ -23,6 +23,7 @@ import threading
import webbrowser
import sqlite3
import cherrypy
+import datetime
from apscheduler.schedulers.background import BackgroundScheduler
from apscheduler.triggers.interval import IntervalTrigger
@@ -262,51 +263,68 @@ def launch_browser(host, port, root):
def initialize_scheduler():
"""
- Start the scheduled background tasks. Because this method can be called
- multiple times, the old tasks will be first removed.
+ Start the scheduled background tasks. Re-schedule if interval settings changed.
"""
from headphones import updater, searcher, librarysync, postprocessor, \
torrentfinished
with SCHED_LOCK:
- # Remove all jobs first, because this method is also invoked when the
- # settings are saved.
- count = len(SCHED.get_jobs())
- if count > 0:
- logger.debug("Current number of background tasks: %d", count)
- SCHED.shutdown()
- SCHED.remove_all_jobs()
+ # Only start scheduler if (re-)starting headphones
+ start_jobs = not len(SCHED.get_jobs())
# Regular jobs
- if CONFIG.UPDATE_DB_INTERVAL > 0:
- SCHED.add_job(updater.dbUpdate, trigger=IntervalTrigger(
- hours=CONFIG.UPDATE_DB_INTERVAL))
if CONFIG.SEARCH_INTERVAL > 0:
- SCHED.add_job(searcher.searchforalbum, trigger=IntervalTrigger(
- minutes=CONFIG.SEARCH_INTERVAL))
- if CONFIG.LIBRARYSCAN_INTERVAL > 0:
- SCHED.add_job(librarysync.libraryScan, trigger=IntervalTrigger(
- hours=CONFIG.LIBRARYSCAN_INTERVAL))
+ minutes = CONFIG.SEARCH_INTERVAL
+ schedule_job(searcher.searchforalbum, 'Search for Wanted', hours=0, minutes=minutes)
+
if CONFIG.DOWNLOAD_SCAN_INTERVAL > 0:
- SCHED.add_job(postprocessor.checkFolder, trigger=IntervalTrigger(
- minutes=CONFIG.DOWNLOAD_SCAN_INTERVAL))
+ minutes = CONFIG.DOWNLOAD_SCAN_INTERVAL
+ schedule_job(postprocessor.checkFolder, 'Download Scan', hours=0, minutes=minutes)
+
+ if CONFIG.LIBRARYSCAN_INTERVAL > 0:
+ hours = CONFIG.LIBRARYSCAN_INTERVAL
+ schedule_job(librarysync.libraryScan, 'Library Scan', hours=hours, minutes=0)
+
+ if CONFIG.UPDATE_DB_INTERVAL > 0:
+ hours = CONFIG.UPDATE_DB_INTERVAL
+ schedule_job(updater.dbUpdate, 'MusicBrainz Update', hours=hours, minutes=0)
# Update check
- if CONFIG.CHECK_GITHUB:
- SCHED.add_job(versioncheck.checkGithub, trigger=IntervalTrigger(
- minutes=CONFIG.CHECK_GITHUB_INTERVAL))
+ if CONFIG.CHECK_GITHUB and CONFIG.CHECK_GITHUB_INTERVAL > 0:
+ minutes = CONFIG.CHECK_GITHUB_INTERVAL
+ schedule_job(versioncheck.checkGithub, 'Check GitHub for updates', hours=0, minutes=minutes)
# Remove Torrent + data if Post Processed and finished Seeding
if CONFIG.TORRENT_REMOVAL_INTERVAL > 0:
- SCHED.add_job(torrentfinished.checkTorrentFinished,
- trigger=IntervalTrigger(
- minutes=CONFIG.TORRENT_REMOVAL_INTERVAL))
+ minutes = CONFIG.TORRENT_REMOVAL_INTERVAL
+ schedule_job(torrentfinished.checkTorrentFinished, 'Torrent removal check', hours=0, minutes=minutes)
- # Start scheduler
- logger.info("(Re-)Scheduled %d background tasks", len(SCHED.get_jobs()))
- SCHED.start()
+ # Start scheduler (only if (re-)starting headphones)
+ if start_jobs and len(SCHED.get_jobs()):
+ SCHED.start()
+
+ # Debug
+ #SCHED.print_jobs()
+
+
+def schedule_job(function, name, hours=0, minutes=0):
+ """
+ Start scheduled job if starting or restarting headphones.
+ Re-schedule job if Interval Settings have changed.
+ """
+
+ job = SCHED.get_job(name)
+ if job:
+ if job.trigger.interval != datetime.timedelta(hours=hours, minutes=minutes):
+ SCHED.reschedule_job(name, trigger=IntervalTrigger(
+ hours=hours, minutes=minutes))
+ logger.info("Re-scheduled background task: %s", name)
+ else:
+ SCHED.add_job(function, id=name, trigger=IntervalTrigger(
+ hours=hours, minutes=minutes))
+ logger.info("Scheduled background task: %s", name)
def start():