This commit is contained in:
Louis Vézina 2020-02-20 06:41:05 -05:00
parent 54376299d9
commit 8749fc13f2
5 changed files with 98 additions and 8 deletions

View File

@ -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')

View File

@ -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():

View File

@ -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())))

View File

@ -188,7 +188,7 @@
<li><a href="#"><i
class="fas fa-laptop"></i><span class="hide-menu"> System</span></a>
<ul aria-expanded="false" class="collapse">
<li><a href="/"> Tasks</a></li>
<li><a href="{{ url_for('systemtasks') }}"> Tasks</a></li>
<li><a href="{{ url_for('systemlogs') }}"> Logs</a></li>
<li><a href="/"> Providers</a></li>
<li><a href="{{ url_for('systemstatus') }}"> Status</a></li>

61
views/systemtasks.html Normal file
View File

@ -0,0 +1,61 @@
{% extends '_main.html' %}
{% block title %}Logs - Bazarr{% endblock %}
{% block bcleft %}
{% endblock bcleft %}
{% block bcright %}
{% endblock bcright %}
{% block body %}
<div class="container-fluid">
<table id="tasks" class="table table-striped" style="width:100%">
<thead>
<tr>
<th>Name</th>
<th>Execution Frequency</th>
<th>Next Execution</th>
<th></th>
</tr>
</thead>
</table>
</div>
{% endblock body %}
{% block tail %}
<script>
$(document).ready(function () {
var table = $('#tasks').DataTable( {
language: {
zeroRecords: 'No Task Scheduled.',
processing: "Loading Tasks..."
},
paging: false,
lengthChange: false,
pageLength: {{ settings.general.page_size }},
searching: false,
ordering: false,
processing: true,
serverSide: false,
ajax: "{{ url_for('api.systemtasks') }}",
columns: [
{
data: 'name'
},
{ data: 'interval'
},
{ data: 'next_run_in'
},
{ data: null,
render: function(data) {
return 'button'
}
}
]
});
})
</script>
{% endblock tail %}