nas-tools/app/scheduler.py
2023-02-14 08:18:49 +08:00

266 lines
11 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import datetime
import math
import random
import traceback
from apscheduler.executors.pool import ThreadPoolExecutor
from apscheduler.schedulers.background import BackgroundScheduler
import log
from app.doubansync import DoubanSync
from app.downloader import Downloader
from app.helper import MetaHelper
from app.mediaserver import MediaServer
from app.rss import Rss
from app.sites import SiteUserInfo, SiteSignin
from app.subscribe import Subscribe
from app.sync import Sync
from app.utils import ExceptionUtils
from app.utils.commons import singleton
from config import PT_TRANSFER_INTERVAL, METAINFO_SAVE_INTERVAL, \
SYNC_TRANSFER_INTERVAL, RSS_CHECK_INTERVAL, REFRESH_PT_DATA_INTERVAL, \
RSS_REFRESH_TMDB_INTERVAL, META_DELETE_UNKNOWN_INTERVAL, REFRESH_WALLPAPER_INTERVAL, Config
from web.backend.wallpaper import get_login_wallpaper
@singleton
class Scheduler:
SCHEDULER = None
_pt = None
_douban = None
_media = None
def __init__(self):
self.init_config()
def init_config(self):
self._pt = Config().get_config('pt')
self._media = Config().get_config('media')
self._douban = Config().get_config('douban')
def run_service(self):
"""
读取配置,启动定时服务
"""
self.SCHEDULER = BackgroundScheduler(timezone=Config().get_timezone(),
executors={
'default': ThreadPoolExecutor(20)
})
if not self.SCHEDULER:
return
if self._pt:
# 站点签到
ptsignin_cron = str(self._pt.get('ptsignin_cron'))
if ptsignin_cron:
if '-' in ptsignin_cron:
try:
time_range = ptsignin_cron.split("-")
start_time_range_str = time_range[0]
end_time_range_str = time_range[1]
start_time_range_array = start_time_range_str.split(":")
end_time_range_array = end_time_range_str.split(":")
start_hour = int(start_time_range_array[0])
start_minute = int(start_time_range_array[1])
end_hour = int(end_time_range_array[0])
end_minute = int(end_time_range_array[1])
def start_random_job():
task_time_count = random.randint(start_hour * 60 + start_minute, end_hour * 60 + end_minute)
self.start_data_site_signin_job(math.floor(task_time_count / 60), task_time_count % 60)
self.SCHEDULER.add_job(start_random_job,
"cron",
hour=start_hour,
minute=start_minute)
log.info("站点自动签到服务时间范围随机模式启动,起始时间于%s:%s" % (
str(start_hour).rjust(2, '0'), str(start_minute).rjust(2, '0')))
except Exception as e:
log.info("站点自动签到时间 时间范围随机模式 配置格式错误:%s %s" % (ptsignin_cron, str(e)))
elif ptsignin_cron.find(':') != -1:
try:
hour = int(ptsignin_cron.split(":")[0])
minute = int(ptsignin_cron.split(":")[1])
except Exception as e:
log.info("站点自动签到时间 配置格式错误:%s" % str(e))
hour = minute = 0
self.SCHEDULER.add_job(SiteSignin().signin,
"cron",
hour=hour,
minute=minute)
log.info("站点自动签到服务启动")
else:
try:
hours = float(ptsignin_cron)
except Exception as e:
log.info("站点自动签到时间 配置格式错误:%s" % str(e))
hours = 0
if hours:
self.SCHEDULER.add_job(SiteSignin().signin,
"interval",
hours=hours)
log.info("站点自动签到服务启动")
# 下载文件转移
pt_monitor = self._pt.get('pt_monitor')
if pt_monitor:
self.SCHEDULER.add_job(Downloader().transfer, 'interval', seconds=PT_TRANSFER_INTERVAL)
log.info("下载文件转移服务启动")
# RSS下载器
pt_check_interval = self._pt.get('pt_check_interval')
if pt_check_interval:
if isinstance(pt_check_interval, str) and pt_check_interval.isdigit():
pt_check_interval = int(pt_check_interval)
else:
try:
pt_check_interval = round(float(pt_check_interval))
except Exception as e:
log.error("RSS订阅周期 配置格式错误:%s" % str(e))
pt_check_interval = 0
if pt_check_interval:
if pt_check_interval < 300:
pt_check_interval = 300
self.SCHEDULER.add_job(Rss().rssdownload, 'interval', seconds=pt_check_interval)
log.info("RSS订阅服务启动")
# RSS订阅定时检索
search_rss_interval = self._pt.get('search_rss_interval')
if search_rss_interval:
if isinstance(search_rss_interval, str) and search_rss_interval.isdigit():
search_rss_interval = int(search_rss_interval)
else:
try:
search_rss_interval = round(float(search_rss_interval))
except Exception as e:
log.error("订阅定时搜索周期 配置格式错误:%s" % str(e))
search_rss_interval = 0
if search_rss_interval:
if search_rss_interval < 6:
search_rss_interval = 6
self.SCHEDULER.add_job(Subscribe().subscribe_search_all, 'interval', hours=search_rss_interval)
log.info("订阅定时搜索服务启动")
# 豆瓣电影同步
if self._douban:
douban_interval = self._douban.get('interval')
if douban_interval:
if isinstance(douban_interval, str):
if douban_interval.isdigit():
douban_interval = int(douban_interval)
else:
try:
douban_interval = float(douban_interval)
except Exception as e:
log.info("豆瓣同步服务启动失败:%s" % str(e))
douban_interval = 0
if douban_interval:
self.SCHEDULER.add_job(DoubanSync().sync, 'interval', hours=douban_interval)
log.info("豆瓣同步服务启动")
# 媒体库同步
if self._media:
mediasync_interval = self._media.get("mediasync_interval")
if mediasync_interval:
if isinstance(mediasync_interval, str):
if mediasync_interval.isdigit():
mediasync_interval = int(mediasync_interval)
else:
try:
mediasync_interval = round(float(mediasync_interval))
except Exception as e:
log.info("豆瓣同步服务启动失败:%s" % str(e))
mediasync_interval = 0
if mediasync_interval:
self.SCHEDULER.add_job(MediaServer().sync_mediaserver, 'interval', hours=mediasync_interval)
log.info("媒体库同步服务启动")
# 元数据定时保存
self.SCHEDULER.add_job(MetaHelper().save_meta_data, 'interval', seconds=METAINFO_SAVE_INTERVAL)
# 定时把队列中的监控文件转移走
self.SCHEDULER.add_job(Sync().transfer_mon_files, 'interval', seconds=SYNC_TRANSFER_INTERVAL)
# RSS队列中检索
self.SCHEDULER.add_job(Subscribe().subscribe_search, 'interval', seconds=RSS_CHECK_INTERVAL)
# 站点数据刷新
self.SCHEDULER.add_job(SiteUserInfo().refresh_pt_date_now,
'interval',
hours=REFRESH_PT_DATA_INTERVAL,
next_run_time=datetime.datetime.now() + datetime.timedelta(minutes=1))
# 豆瓣RSS转TMDB定时更新TMDB数据
self.SCHEDULER.add_job(Subscribe().refresh_rss_metainfo, 'interval', hours=RSS_REFRESH_TMDB_INTERVAL)
# 定时清除未识别的缓存
self.SCHEDULER.add_job(MetaHelper().delete_unknown_meta, 'interval', hours=META_DELETE_UNKNOWN_INTERVAL)
# 定时刷新壁纸
self.SCHEDULER.add_job(get_login_wallpaper,
'interval',
hours=REFRESH_WALLPAPER_INTERVAL,
next_run_time=datetime.datetime.now())
self.SCHEDULER.print_jobs()
self.SCHEDULER.start()
def stop_service(self):
"""
停止定时服务
"""
try:
if self.SCHEDULER:
self.SCHEDULER.remove_all_jobs()
self.SCHEDULER.shutdown()
self.SCHEDULER = None
except Exception as e:
ExceptionUtils.exception_traceback(e)
def start_data_site_signin_job(self, hour, minute):
year = datetime.datetime.now().year
month = datetime.datetime.now().month
day = datetime.datetime.now().day
# 随机数从1秒开始不在整点签到
second = random.randint(1, 59)
log.info("站点自动签到时间 即将在%s-%s-%s,%s:%s:%s签到" % (
str(year), str(month), str(day), str(hour), str(minute), str(second)))
if hour < 0 or hour > 24:
hour = -1
if minute < 0 or minute > 60:
minute = -1
if hour < 0 or minute < 0:
log.warn("站点自动签到时间 配置格式错误:不启动任务")
return
self.SCHEDULER.add_job(SiteSignin().signin,
"date",
run_date=datetime.datetime(year, month, day, hour, minute, second))
def run_scheduler():
"""
启动定时服务
"""
try:
Scheduler().run_service()
except Exception as err:
log.error("启动定时服务失败:%s - %s" % (str(err), traceback.format_exc()))
def stop_scheduler():
"""
停止定时服务
"""
try:
Scheduler().stop_service()
except Exception as err:
log.debug("停止定时服务失败:%s" % str(err))
def restart_scheduler():
"""
重启定时服务
"""
stop_scheduler()
run_scheduler()