From 8749fc13f23f15e6af397f2553ab2b3a128f686a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Louis=20V=C3=A9zina?= <5130500+morpheus65535@users.noreply.github.com> Date: Thu, 20 Feb 2020 06:41:05 -0500 Subject: [PATCH] WIP --- bazarr/api.py | 12 +++++++++ bazarr/main.py | 6 +++++ bazarr/scheduler.py | 25 ++++++++++++----- views/_main.html | 2 +- views/systemtasks.html | 61 ++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 98 insertions(+), 8 deletions(-) create mode 100644 views/systemtasks.html diff --git a/bazarr/api.py b/bazarr/api.py index 26f2640c3..5121c97ff 100644 --- a/bazarr/api.py +++ b/bazarr/api.py @@ -8,6 +8,7 @@ import time from operator import itemgetter import platform import io +from calendar import day_name from get_args import args from config import settings, base_url @@ -27,6 +28,7 @@ from list_subtitles import store_subtitles, store_subtitles_movie, series_scan_s from utils import history_log, history_log_movie, get_sonarr_version, get_radarr_version from get_providers import get_providers, get_providers_auth, list_throttled_providers from websocket_handler import event_stream +from scheduler import Scheduler from subliminal_patch.core import SUBTITLE_EXTENSIONS @@ -60,6 +62,15 @@ class Languages(Resource): return jsonify(result) +class SystemTasks(Resource): + def get(self): + scheduler = Scheduler() + + task_list = scheduler.get_task_list() + + return jsonify(data=task_list) + + class SystemLogs(Resource): def get(self): logs = [] @@ -1090,6 +1101,7 @@ class SearchWantedMovies(Resource): api.add_resource(Badges, '/badges') api.add_resource(Languages, '/languages') +api.add_resource(SystemTasks, '/systemtasks') api.add_resource(SystemLogs, '/systemlogs') api.add_resource(SystemStatus, '/systemstatus') api.add_resource(SystemReleases, '/systemreleases') diff --git a/bazarr/main.py b/bazarr/main.py index 26cbcd584..4a304e23b 100644 --- a/bazarr/main.py +++ b/bazarr/main.py @@ -1016,6 +1016,12 @@ def check_update(): redirect(ref) +@app.route('/systemtasks') +@login_required +def systemtasks(): + return render_template('systemtasks.html') + + @app.route('/systemlogs') @login_required def systemlogs(): diff --git a/bazarr/scheduler.py b/bazarr/scheduler.py index 174aa6fa1..94c5c1a5d 100644 --- a/bazarr/scheduler.py +++ b/bazarr/scheduler.py @@ -16,12 +16,13 @@ from apscheduler.triggers.interval import IntervalTrigger from apscheduler.triggers.cron import CronTrigger from apscheduler.triggers.date import DateTrigger from apscheduler.events import EVENT_JOB_SUBMITTED, EVENT_JOB_EXECUTED, EVENT_JOB_ERROR -from datetime import datetime +from datetime import datetime, timedelta import pytz from tzlocal import get_localzone from calendar import day_name import pretty -from six import PY2 +from random import seed, uniform, randint +from websocket_handler import event_stream class Scheduler: @@ -38,10 +39,12 @@ class Scheduler: def task_listener_add(event): if event.job_id not in self.__running_tasks: self.__running_tasks.append(event.job_id) + event_stream.write(type='task', action='insert') def task_listener_remove(event): if event.job_id in self.__running_tasks: self.__running_tasks.remove(event.job_id) + event_stream.write(type='task', action='delete') self.aps_scheduler.add_listener(task_listener_add, EVENT_JOB_SUBMITTED) self.aps_scheduler.add_listener(task_listener_remove, EVENT_JOB_EXECUTED | EVENT_JOB_ERROR) @@ -60,6 +63,7 @@ class Scheduler: self.__update_bazarr_task() self.__search_wanted_subtitles_task() self.__upgrade_subtitles_task() + self.__randomize_interval_task() def add_job(self, job, name=None, max_instances=1, coalesce=True, args=None): self.aps_scheduler.add_job( @@ -123,9 +127,12 @@ class Scheduler: if isinstance(job.trigger, IntervalTrigger): interval = "every " + get_time_from_interval(job.trigger.__getstate__()['interval']) - task_list.append([job.name, interval, next_run, job.id]) + task_list.append({'name': job.name, 'interval': interval, 'next_run_in': next_run, + 'next_run_time': job.next_run_time.replace(tzinfo=None), 'job_id': job.id}) elif isinstance(job.trigger, CronTrigger): - task_list.append([job.name, get_time_from_cron(job.trigger.fields), next_run, job.id]) + task_list.append({'name': job.name, 'interval': get_time_from_cron(job.trigger.fields), + 'next_run_in': next_run, 'next_run_time': job.next_run_time.replace(tzinfo=None), + 'job_id': job.id}) return task_list @@ -188,9 +195,7 @@ class Scheduler: id='update_all_movies', name='Update all Movie Subtitles from disk', replace_existing=True) def __update_bazarr_task(self): - if PY2: - pass - elif not args.no_update: + if not args.no_update: task_name = 'Update Bazarr from source on Github' if args.release_update: task_name = 'Update Bazarr from release on Github' @@ -231,3 +236,9 @@ class Scheduler: upgrade_subtitles, IntervalTrigger(hours=int(settings.general.upgrade_frequency)), max_instances=1, coalesce=True, misfire_grace_time=15, id='upgrade_subtitles', name='Upgrade previously downloaded Subtitles', replace_existing=True) + + def __randomize_interval_task(self): + for job in self.aps_scheduler.get_jobs(): + if isinstance(job.trigger, IntervalTrigger): + seed(randint(0,1000)) + self.aps_scheduler.modify_job(job.id, next_run_time=datetime.now() + timedelta(seconds=uniform(job.trigger.interval.total_seconds()*0.75, job.trigger.interval.total_seconds()))) diff --git a/views/_main.html b/views/_main.html index dfb02e983..9aa665f00 100644 --- a/views/_main.html +++ b/views/_main.html @@ -188,7 +188,7 @@
  • System