diff --git a/app/api/endpoints/system.py b/app/api/endpoints/system.py index 5d285691..dd8bfb10 100644 --- a/app/api/endpoints/system.py +++ b/app/api/endpoints/system.py @@ -11,12 +11,13 @@ from sqlalchemy.orm import Session from app import schemas from app.chain.search import SearchChain from app.core.config import settings +from app.core.event import eventmanager from app.core.security import verify_token from app.db import get_db from app.db.systemconfig_oper import SystemConfigOper from app.helper.message import MessageHelper from app.helper.progress import ProgressHelper -from app.schemas.types import SystemConfigKey +from app.schemas.types import SystemConfigKey, EventType from app.utils.http import RequestUtils from app.utils.system import SystemUtils from version import APP_VERSION @@ -211,3 +212,17 @@ def restart_system(_: schemas.TokenPayload = Depends(verify_token)): # 执行重启 ret, msg = SystemUtils.restart() return schemas.Response(success=ret, message=msg) + + +@router.get("/command", summary="执行命令", response_model=schemas.Response) +def execute_command(cmd: str, + _: schemas.TokenPayload = Depends(verify_token)): + """ + 执行命令 + """ + if not cmd: + return schemas.Response(success=False, message="命令不能为空!") + eventmanager.send_event(etype=EventType.CommandExcute, data={ + "cmd": cmd + }) + return schemas.Response(success=True) diff --git a/app/command.py b/app/command.py index b1e2ecc3..b86e8d85 100644 --- a/app/command.py +++ b/app/command.py @@ -107,6 +107,11 @@ class Command(metaclass=Singleton): "description": "删除订阅", "data": {} }, + "/subscribe_tmdb": { + "func": SubscribeChain(self._db).check, + "description": "订阅TMDB数据刷新", + "data": {} + }, "/downloading": { "func": DownloadChain(self._db).remote_downloading, "description": "正在下载", @@ -216,7 +221,10 @@ class Command(metaclass=Singleton): command = self.get(cmd) if command: try: - logger.info(f"用户 {userid} 开始执行:{command.get('description')} ...") + if userid: + logger.info(f"用户 {userid} 开始执行:{command.get('description')} ...") + else: + logger.info(f"开始执行:{command.get('description')} ...") cmd_data = command['data'] if command.get('data') else {} args_num = ObjectUtils.arguments(command['func']) if args_num > 0: @@ -236,7 +244,10 @@ class Command(metaclass=Singleton): else: # 没有参数 command['func']() - logger.info(f"用户 {userid} {command.get('description')} 执行完成") + if userid: + logger.info(f"用户 {userid} {command.get('description')} 执行完成") + else: + logger.info(f"{command.get('description')} 执行完成") except Exception as err: logger.error(f"执行命令 {cmd} 出错:{str(err)}") traceback.print_exc() diff --git a/app/scheduler.py b/app/scheduler.py index 6e49916a..3f93f52b 100644 --- a/app/scheduler.py +++ b/app/scheduler.py @@ -49,6 +49,7 @@ class Scheduler(metaclass=Singleton): "interval", minutes=settings.COOKIECLOUD_INTERVAL, next_run_time=datetime.now(pytz.timezone(settings.TZ)) + timedelta(minutes=1), + id="cookiecloud", name="同步CookieCloud站点") # 媒体服务器同步 @@ -56,6 +57,7 @@ class Scheduler(metaclass=Singleton): self._scheduler.add_job(MediaServerChain(self._db).sync, "interval", hours=settings.MEDIASERVER_SYNC_INTERVAL, next_run_time=datetime.now(pytz.timezone(settings.TZ)) + timedelta(minutes=5), + id="mediaserver_sync", name="同步媒体服务器") # 新增订阅时搜索(5分钟检查一次) @@ -63,19 +65,23 @@ class Scheduler(metaclass=Singleton): minutes=5, kwargs={'state': 'N'}) # 检查更新订阅TMDB数据(每隔6小时) - self._scheduler.add_job(SubscribeChain(self._db).check, "interval", hours=6) + self._scheduler.add_job(SubscribeChain(self._db).check, "interval", hours=6, + id="subscribe_tmdb", name="订阅元数据更新") # 订阅状态每隔24小时搜索一次 if settings.SUBSCRIBE_SEARCH: self._scheduler.add_job(SubscribeChain(self._db).search, "interval", - hours=24, kwargs={'state': 'R'}, name="订阅搜索") + hours=24, kwargs={'state': 'R'}, + id="subscribe_search", name="订阅搜索") if settings.SUBSCRIBE_MODE == "spider": # 站点首页种子定时刷新模式 triggers = TimerUtils.random_scheduler(num_executions=30) for trigger in triggers: self._scheduler.add_job(SubscribeChain(self._db).refresh, "cron", - hour=trigger.hour, minute=trigger.minute, name="订阅刷新") + hour=trigger.hour, minute=trigger.minute, + id=f"subscribe_refresh|{trigger.hour}:{trigger.minute}", + name="订阅刷新") else: # RSS订阅模式 if not settings.SUBSCRIBE_RSS_INTERVAL: @@ -83,11 +89,13 @@ class Scheduler(metaclass=Singleton): elif settings.SUBSCRIBE_RSS_INTERVAL < 5: settings.SUBSCRIBE_RSS_INTERVAL = 5 self._scheduler.add_job(SubscribeChain(self._db).refresh, "interval", - minutes=settings.SUBSCRIBE_RSS_INTERVAL, name="订阅刷新") + minutes=settings.SUBSCRIBE_RSS_INTERVAL, + id="subscribe_refresh", name="订阅刷新") # 下载器文件转移(每5分钟) if settings.DOWNLOADER_MONITOR: - self._scheduler.add_job(TransferChain(self._db).process, "interval", minutes=5, name="下载文件整理") + self._scheduler.add_job(TransferChain(self._db).process, "interval", minutes=5, + id="transfer", name="下载文件整理") # 公共定时服务 self._scheduler.add_job(SchedulerChain(self._db).scheduler_job, "interval", minutes=10)