From 036a14a8ade59bcaf0a696c74d24035b0416b9c0 Mon Sep 17 00:00:00 2001 From: thsrite Date: Mon, 4 Dec 2023 15:08:09 +0800 Subject: [PATCH] =?UTF-8?q?feat=20=E6=97=A5=E7=A8=8B=E6=8F=90=E9=86=92?= =?UTF-8?q?=E6=8F=92=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 1 + icons/reminder.png | Bin 0 -> 5041 bytes package.json | 19 ++- plugins/cloudstrm/__init__.py | 2 +- plugins/schedulereminder/__init__.py | 186 +++++++++++++++++++++++++++ plugins_record/ScheduleReminder.md | 5 + 6 files changed, 201 insertions(+), 12 deletions(-) create mode 100644 icons/reminder.png create mode 100644 plugins/schedulereminder/__init__.py create mode 100644 plugins_record/ScheduleReminder.md diff --git a/README.md b/README.md index 43521bc..95dc5e8 100644 --- a/README.md +++ b/README.md @@ -20,5 +20,6 @@ MoviePilot三方插件市场:https://github.com/thsrite/MoviePilot-Plugins/ - [插件强制重装 1.2](plugins_record%2FPluginReInstall.md) - [群辉Webhook通知 1.1](plugins_record%2FSynologyNotify.md) - [同步CookieCloud 1.1](plugins_record%2FSyncCookieCloud.md) +- [日程提醒 1.0](plugins_record%2FScheduleReminder.md) diff --git a/icons/reminder.png b/icons/reminder.png new file mode 100644 index 0000000000000000000000000000000000000000..001cf877ac5539be7becae850bfff3faf7d7d748 GIT binary patch literal 5041 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 literal 0 HcmV?d00001 diff --git a/package.json b/package.json index cabf902..5c8ab44 100644 --- a/package.json +++ b/package.json @@ -4,7 +4,6 @@ "description": "自动统计和展示站点数据(无站点未读消息)。", "version": "1.0", "icon": "statistic.png", - "color": "#324A5E", "author": "lightolly", "level": 2 }, @@ -13,7 +12,6 @@ "description": "监控文件创建,生成Strm文件。", "version": "1.7", "icon": "https://raw.githubusercontent.com/thsrite/MoviePilot-Plugins/main/icons/create.png", - "color": "#999999", "author": "thsrite", "level": 1 }, @@ -22,7 +20,6 @@ "description": "Strm文件内容转为本地路径或者cd2/alist API路径。", "version": "1.0", "icon": "https://raw.githubusercontent.com/thsrite/MoviePilot-Plugins/main/icons/convert.png", - "color": "#7eabf3", "author": "thsrite", "level": 1 }, @@ -31,7 +28,6 @@ "description": "发送站点未读消息。", "version": "1.2", "icon": "Synomail_A.png", - "color": "#4179F4", "author": "thsrite", "level": 2 }, @@ -40,7 +36,6 @@ "description": "清理订阅已下载集数。", "version": "1.0", "icon": "https://raw.githubusercontent.com/thsrite/MoviePilot-Plugins/main/icons/broom.png", - "color": "#80bef7", "author": "thsrite", "level": 2 }, @@ -49,7 +44,6 @@ "description": "选择下载器,添加种子任务。", "version": "1.0", "icon": "download.png", - "color": "#f87878", "author": "thsrite", "level": 1 }, @@ -58,7 +52,6 @@ "description": "删除下载器中某站点种子。", "version": "1.1", "icon": "delete.png", - "color": "#f25454", "author": "thsrite", "level": 1 }, @@ -67,7 +60,6 @@ "description": "监测已安装插件,自动更新最新版本。", "version": "1.2", "icon": "https://raw.githubusercontent.com/thsrite/MoviePilot-Plugins/main/icons/pluginupdate.png", - "color": "#95eb95", "author": "thsrite", "level": 1 }, @@ -76,7 +68,6 @@ "description": "卸载当前插件,强制重装。", "version": "1.2", "icon": "refresh.png", - "color": "#3c78d8", "author": "thsrite", "level": 1 }, @@ -85,7 +76,6 @@ "description": "接收群辉webhook通知并推送。", "version": "1.1", "icon": "https://raw.githubusercontent.com/thsrite/MoviePilot-Plugins/main/icons/synology.png", - "color": "#adc8f7", "author": "thsrite", "level": 1 }, @@ -94,7 +84,14 @@ "description": "同步MoviePilot站点Cookie到CookieCloud。", "version": "1.1", "icon": "https://raw.githubusercontent.com/thsrite/MoviePilot-Plugins/main/icons/cookiecloud.png", - "color": "#adc8f7", + "author": "thsrite", + "level": 1 + }, + "ScheduleReminder": { + "name": "日程提醒", + "description": "自定义提醒事项、提醒时间。", + "version": "1.0", + "icon": "https://raw.githubusercontent.com/thsrite/MoviePilot-Plugins/main/icons/reminder.png", "author": "thsrite", "level": 1 } diff --git a/plugins/cloudstrm/__init__.py b/plugins/cloudstrm/__init__.py index b537b5a..bfd7347 100644 --- a/plugins/cloudstrm/__init__.py +++ b/plugins/cloudstrm/__init__.py @@ -58,7 +58,7 @@ class CloudStrm(_PluginBase): # 私有属性 _enabled = False - _monitor_confs = [] + _monitor_confs = None _onlyonce = False _relay = 3 _observer = [] diff --git a/plugins/schedulereminder/__init__.py b/plugins/schedulereminder/__init__.py new file mode 100644 index 0000000..ac774f2 --- /dev/null +++ b/plugins/schedulereminder/__init__.py @@ -0,0 +1,186 @@ +from app.core.config import settings +from app.db.site_oper import SiteOper +from app.plugins import _PluginBase +from typing import Any, List, Dict, Tuple, Optional +from app.log import logger +from apscheduler.schedulers.background import BackgroundScheduler +from apscheduler.triggers.cron import CronTrigger + +from app.schemas import NotificationType + + +class ScheduleReminder(_PluginBase): + # 插件名称 + plugin_name = "日程提醒" + # 插件描述 + plugin_desc = "自定义提醒事项、提醒时间。" + # 插件图标 + plugin_icon = "https://raw.githubusercontent.com/thsrite/MoviePilot-Plugins/main/icons/reminder.png" + # 插件版本 + plugin_version = "1.0" + # 插件作者 + plugin_author = "thsrite" + # 作者主页 + author_url = "https://github.com/thsrite" + # 插件配置项ID前缀 + plugin_config_prefix = "schedulereminder_" + # 加载顺序 + plugin_order = 32 + # 可使用的用户级别 + auth_level = 1 + + # 私有属性 + _enabled: bool = False + _confs = None + siteoper = None + _scheduler: Optional[BackgroundScheduler] = None + + def init_plugin(self, config: dict = None): + self.siteoper = SiteOper() + + # 停止现有任务 + self.stop_service() + + if config: + self._enabled = config.get("enabled") + self._confs = config.get("confs") + + if self._enabled and self._confs: + # 周期运行 + self._scheduler = BackgroundScheduler(timezone=settings.TZ) + + # 读取目录配置 + confs = self._confs.split("\n") + if not confs: + return + for conf in confs: + if str(conf).count(":") != 1: + logger.warn(f"{conf} 格式错误,跳过处理") + continue + try: + self._scheduler.add_job(func=self.__send_notify, + trigger=CronTrigger.from_crontab(str(conf).split(":")[1]), + name=f"{str(conf).split(':')[0]}提醒", + kwargs={"theme": str(conf).split(":")[0]}) + except Exception as err: + logger.error(f"定时任务配置错误:{err}") + # 推送实时消息 + self.systemmessage.put(f"执行周期配置错误:{err}") + + # 启动任务 + if self._scheduler.get_jobs(): + self._scheduler.print_jobs() + self._scheduler.start() + + def __send_notify(self, theme: str): + """ + 同步站点cookie到cookiecloud + """ + self.post_message(mtype=NotificationType.Manual, + title="日程提醒", + text=theme) + + def get_state(self) -> bool: + return False + + @staticmethod + def get_command() -> List[Dict[str, Any]]: + pass + + def get_api(self) -> List[Dict[str, Any]]: + pass + + def get_form(self) -> Tuple[List[dict], Dict[str, Any]]: + """ + 拼装插件配置页面,需要返回两块数据:1、页面配置;2、数据结构 + """ + return [ + { + 'component': 'VForm', + 'content': [ + { + 'component': 'VRow', + 'content': [ + { + 'component': 'VCol', + 'props': { + 'cols': 12, + }, + 'content': [ + { + 'component': 'VSwitch', + 'props': { + 'model': 'enabled', + 'label': '启用插件', + } + } + ] + } + ] + }, + { + 'component': 'VRow', + 'content': [ + { + 'component': 'VCol', + 'props': { + 'cols': 12, + }, + 'content': [ + { + 'component': 'VTextarea', + 'props': { + 'model': 'confs', + 'label': '提醒事项', + 'rows': 5, + 'placeholder': '提醒内容:cron' + } + } + ] + }, + ] + }, + { + 'component': 'VRow', + 'content': [ + { + 'component': 'VCol', + 'props': { + 'cols': 12, + }, + 'content': [ + { + 'component': 'VAlert', + 'props': { + 'type': 'info', + 'variant': 'tonal', + 'text': '提醒事项格式为:提醒内容:提醒时间cron表达式(一行一条)。' + '需开启(手动处理通知)通知类型' + } + } + ] + } + ] + } + ] + } + ], { + "enabled": False, + "confs": "", + } + + def get_page(self) -> List[dict]: + pass + + def stop_service(self): + """ + 退出插件 + """ + 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)) diff --git a/plugins_record/ScheduleReminder.md b/plugins_record/ScheduleReminder.md new file mode 100644 index 0000000..4861855 --- /dev/null +++ b/plugins_record/ScheduleReminder.md @@ -0,0 +1,5 @@ +# 日程提醒 + +### 更新记录 + +- 1.0 自定义提醒事项、提醒时间