From 8ad75e93a9fbb9565565c4654de2181ad7f8e7ba Mon Sep 17 00:00:00 2001 From: thsrite Date: Thu, 31 Aug 2023 15:51:39 +0800 Subject: [PATCH] =?UTF-8?q?fix=20=E4=B8=8B=E8=BD=BD=E5=99=A8=E4=BB=BB?= =?UTF-8?q?=E5=8A=A1=E5=90=8C=E6=AD=A5=E6=8F=92=E4=BB=B6=E6=94=AF=E6=8C=81?= =?UTF-8?q?=E5=91=A8=E6=9C=9F=E8=BF=90=E8=A1=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/plugins/syncdownloadfiles/__init__.py | 118 ++++++++++++++++++++-- 1 file changed, 107 insertions(+), 11 deletions(-) diff --git a/app/plugins/syncdownloadfiles/__init__.py b/app/plugins/syncdownloadfiles/__init__.py index f1e44376..413c7602 100644 --- a/app/plugins/syncdownloadfiles/__init__.py +++ b/app/plugins/syncdownloadfiles/__init__.py @@ -1,13 +1,18 @@ import os import time +from datetime import datetime from pathlib import Path +from apscheduler.schedulers.background import BackgroundScheduler +from apscheduler.triggers.cron import CronTrigger + +from app.core.config import settings from app.db.downloadhistory_oper import DownloadHistoryOper from app.db.transferhistory_oper import TransferHistoryOper from app.modules.qbittorrent import Qbittorrent from app.modules.transmission import Transmission from app.plugins import _PluginBase -from typing import Any, List, Dict, Tuple +from typing import Any, List, Dict, Tuple, Optional from app.log import logger @@ -34,6 +39,9 @@ class SyncDownloadFiles(_PluginBase): auth_level = 2 # 私有属性 + _enabled = False + # 任务执行间隔 + _time = None qb = None tr = None _onlyonce = False @@ -43,8 +51,16 @@ class SyncDownloadFiles(_PluginBase): downloadhis = None transferhis = None + # 定时器 + _scheduler: Optional[BackgroundScheduler] = None + def init_plugin(self, config: dict = None): + # 停止现有任务 + self.stop_service() + if config: + self._enabled = config.get('enabled') + self._time = config.get('time') or 6 self._history = config.get('history') self._onlyonce = config.get("onlyonce") self._downloaders = config.get('downloaders') or [] @@ -59,19 +75,38 @@ class SyncDownloadFiles(_PluginBase): # 关闭onlyonce self._onlyonce = False - self.update_config({ - "history": self._history, - "onlyonce": self._onlyonce, - "downloaders": self._downloaders, - "dirs": self._dirs - }) + self.__update_config() self.sync() + if self._enabled: + # 定时服务 + self._scheduler = BackgroundScheduler(timezone=settings.TZ) + if self._time: + try: + self._scheduler.add_job(func=self.sync, + trigger="interval", + hours=float(self._time.strip()), + name="自动同步下载器文件记录") + logger.info(f"自动同步下载器文件记录服务启动,时间间隔 {self._time} 小时") + except Exception as err: + logger.error(f"定时任务配置错误:{err}") + + # 启动任务 + if self._scheduler.get_jobs(): + self._scheduler.print_jobs() + self._scheduler.start() + else: + self._enabled = False + self.__update_config() + def sync(self): """ 同步所选下载器种子记录 """ + start_time = datetime.now() + logger.info("开始同步下载器任务文件记录") + if not self._downloaders: logger.error("未选择同步下载器,停止运行") return @@ -161,6 +196,21 @@ class SyncDownloadFiles(_PluginBase): self.save_data(f"last_sync_time_{downloader}", time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time()))) + # 计算耗时 + end_time = datetime.now() + + logger.info(f"下载器任务文件记录已同步完成。总耗时 {(end_time - start_time).seconds} 秒") + + def __update_config(self): + self.update_config({ + "enabled": self._enabled, + "time": self._time, + "history": self._history, + "onlyonce": self._onlyonce, + "downloaders": self._downloaders, + "dirs": self._dirs + }) + @staticmethod def __get_origin_torrents(torrents: Any, dl_tpe: str): # 把种子按照名称和种子大小分组,获取添加时间最早的一个,认定为是源种子,其余为辅种 @@ -284,7 +334,7 @@ class SyncDownloadFiles(_PluginBase): return None def get_state(self) -> bool: - return False + return self._enabled @staticmethod def get_command() -> List[Dict[str, Any]]: @@ -308,7 +358,23 @@ class SyncDownloadFiles(_PluginBase): 'component': 'VCol', 'props': { 'cols': 12, - 'md': 6 + 'md': 4 + }, + 'content': [ + { + 'component': 'VSwitch', + 'props': { + 'model': 'enabled', + 'label': '开启插件', + } + } + ] + }, + { + 'component': 'VCol', + 'props': { + 'cols': 12, + 'md': 4 }, 'content': [ { @@ -324,7 +390,7 @@ class SyncDownloadFiles(_PluginBase): 'component': 'VCol', 'props': { 'cols': 12, - 'md': 6 + 'md': 4 }, 'content': [ { @@ -338,6 +404,26 @@ class SyncDownloadFiles(_PluginBase): }, ] }, + { + 'component': 'VRow', + 'content': [ + { + 'component': 'VCol', + 'props': { + 'cols': 12, + }, + 'content': [ + { + 'component': 'VTextField', + 'props': { + 'model': 'time', + 'label': '时间间隔' + } + } + ] + }, + ] + }, { 'component': 'VRow', 'content': [ @@ -399,6 +485,7 @@ class SyncDownloadFiles(_PluginBase): 'component': 'VAlert', 'props': { 'text': '如果所选下载器种子很多的话,时间会有点久,请耐心等候,可查看日志。' + '时间间隔建议最少每6小时执行一次,防止上次任务没处理完。' } } ] @@ -408,8 +495,10 @@ class SyncDownloadFiles(_PluginBase): ] } ], { + "enabled": False, "onlyonce": False, "history": False, + "time": 6, "dirs": "", "downloaders": [] } @@ -421,4 +510,11 @@ class SyncDownloadFiles(_PluginBase): """ 退出插件 """ - pass + try: + if self._scheduler: + self._scheduler.remove_all_jobs() + if self._scheduler.running: + self._scheduler.shutdown() + self._scheduler = None + except Exception as e: + logger.error("退出插件失败:%s" % str(e))