From fd44eb70b037aad4fa1f0e1c1a4bb8f1f25ba5f6 Mon Sep 17 00:00:00 2001 From: Attente <19653207+wikrin@users.noreply.github.com> Date: Mon, 9 Sep 2024 05:34:19 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9:=20UA,=20=E9=94=99=E8=AF=AF?= =?UTF-8?q?=E5=AD=97=E7=AC=A6=20=E6=96=B0=E5=A2=9E:=20=E8=87=AA=E5=8A=A8?= =?UTF-8?q?=E5=8F=96=E6=B6=88=E8=AE=A2=E9=98=85=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package.json | 3 +- plugins/bangumicoll/__init__.py | 97 +++++++++++++++++++++++---------- 2 files changed, 71 insertions(+), 29 deletions(-) diff --git a/package.json b/package.json index d81f56b..9a6f9e7 100644 --- a/package.json +++ b/package.json @@ -3,11 +3,12 @@ "name": "Bangumi收藏订阅", "description": "Bangumi用户收藏添加到订阅", "labels": "订阅", - "version": "1.0", + "version": "1.1", "icon": "https://raw.githubusercontent.com/wikrin/MoviePilot-Plugins/main/icons/bangumi_b.png", "author": "Attente", "level": 2, "history": { + "v1.1": "新增根据收藏状态移除由此插件添加的订阅", "v1.0": "将bangumi用户收藏添加到 MP 订阅,部分功能未实现" } } diff --git a/plugins/bangumicoll/__init__.py b/plugins/bangumicoll/__init__.py index b19b256..52a0dbc 100644 --- a/plugins/bangumicoll/__init__.py +++ b/plugins/bangumicoll/__init__.py @@ -1,12 +1,9 @@ import datetime - from typing import Optional, Any, List, Dict - import pytz + from apscheduler.schedulers.background import BackgroundScheduler - from apscheduler.triggers.cron import CronTrigger - from app.chain.subscribe import SubscribeChain from app.core.config import settings @@ -16,6 +13,9 @@ from app.log import logger from app.plugins import _PluginBase from app.db.site_oper import SiteOper from app.utils.http import RequestUtils +from app.db.subscribe_oper import SubscribeOper +from app.helper.subscribe import SubscribeHelper +from app.schemas.types import NotificationType class BangumiColl(_PluginBase): @@ -26,7 +26,7 @@ class BangumiColl(_PluginBase): # 插件图标 plugin_icon = "https://raw.githubusercontent.com/wikrin/MoviePilot-Plugins/main/icons/bangumi_b.png" # 插件版本 - plugin_version = "1.0" + plugin_version = "1.1" # 插件作者 plugin_author = "Attente" # 作者主页 @@ -41,6 +41,8 @@ class BangumiColl(_PluginBase): # 私有变量 _scheduler: Optional[BackgroundScheduler] = None siteoper: SiteOper = None + subscribehelper: SubscribeHelper = None + subscribeoper: SubscribeOper = None # 配置属性 _enabled: bool = False @@ -51,14 +53,14 @@ class BangumiColl(_PluginBase): _exclude: str = "" _uid: str = "" _collection_type = [] - _collection: Dict = {} _save_path: str = "" _sites: list = [] - def init_plugin(self, config: dict = None): self.subscribechain = SubscribeChain() self.siteoper = SiteOper() + self.subscribehelper = SubscribeHelper() + self.subscribeoper = SubscribeOper() # 停止现有任务 self.stop_service() @@ -73,7 +75,6 @@ class BangumiColl(_PluginBase): self._exclude = config.get("exclude") self._uid = config.get("uid") self._collection_type = config.get("collection_type") or [3] - self._collection = config.get("collection") self._save_path = config.get("save_path") self._sites = config.get("sites") @@ -110,7 +111,6 @@ class BangumiColl(_PluginBase): "cron": self._cron, "uid": self._uid, "collection_type": self._collection_type, - "collection": self._collection, "include": self._include, "exclude": self._exclude, "save_path": self._save_path, @@ -159,7 +159,7 @@ class BangumiColl(_PluginBase): 'component': 'VSwitch', 'props': { 'model': 'notify', - 'label': '发送通知', + 'label': '自动取消订阅并通知', }, } ], @@ -323,6 +323,7 @@ class BangumiColl(_PluginBase): pass # 注册定时任务 + def get_service(self) -> List[Dict[str, Any]]: """ 注册插件公共服务 @@ -382,11 +383,11 @@ class BangumiColl(_PluginBase): addr = f"https://api.bgm.tv/v0/users/{self._uid}/collections?subject_type=2" headers = { - "User-Agent": "jxxghp/MoviePilot-Plugins (https://github.com/jxxghp/MoviePilot-Plugins)" + "User-Agent": "wikrin/MoviePilot-Plugins (https://github.com/wikrin/MoviePilot-Plugins)" } try: - logger.info(f"查询bangumi条目信息:{addr} ...") + logger.info(f"查询bangumi条目信息:{addr}") res = RequestUtils(headers=headers).get_res(url=addr) res = res.json().get("data") if not res: @@ -399,7 +400,11 @@ class BangumiColl(_PluginBase): logger.info(f"解析Bangumi条目信息...") for item in res: if item.get("type") not in self._collection_type: + logger.debug( + f"条目: {item['subject'].get('name_cn')} 类型:{item.get('type')} 不符合" + ) continue + # 条目id subject_id = item.get("subject_id") # 主标题 @@ -411,32 +416,44 @@ class BangumiColl(_PluginBase): ## 这里在后面添加排除规则 items.update({subject_id: {"name": name, "name_cn": name_cn, "date": date}}) ## 获取此插件添加的订阅 - db_sub = {i.bangumiid: i.id for i in self.subscribechain.subscribeoper.list() if i.bangumiid and i.username == "Bangumi订阅"} + db_sub = { + i.bangumiid: i.id + for i in self.subscribechain.subscribeoper.list() + if i.bangumiid and i.username == "Bangumi订阅" + } # 新增条目 new_sub = items.keys() - db_sub.keys() - # 移除条目, 这里暂时不做 - # del_sub = dbrid.keys() - items.keys() + logger.debug(f"待新增条目:{new_sub}") + # 移除条目 + del_sub = db_sub.keys() - items.keys() + logger.debug(f"待移除条目:{del_sub}") + logger.info(f"解析Bangumi条目信息完成,共{len(items)}条,新增{len(new_sub)}条") - # # 执行移除操作 - # if del_sub: - # del_items = {dbrid[i]: i for i in del_sub} - # logger.info(f"开始移除订阅...") - # self.delete_subscribe(del_items) - + # 执行移除操作 + if del_sub and self._notify: + # 数据库id为键,bgm条目id为值 + del_items = {db_sub[i]: i for i in del_sub} + logger.info(f"开始移除订阅...") + self.delete_subscribe(del_items) + # 执行添加操作 if new_sub: + # bgm条目id为键,bgm条目信息为值 new_sub = {i: items[i] for i in new_sub} logger.info(f"开始添加订阅...") self.add_subscribe(new_sub) - + # 结束 logger.info(f"Bangumi收藏订阅执行完成") - - # 添加订阅 + def add_subscribe(self, items: Dict[int, Dict[str, Any]]): + ''' + 添加订阅 + :param items: bgm条目id为键,bgm条目信息为值 + ''' for subject_id, item in items.items(): meta = MetaInfo(item.get("name_cn")) if not meta.name: @@ -478,9 +495,33 @@ class BangumiColl(_PluginBase): username="Bangumi订阅", **kwargs, ) - - def delete_subscribe(self, del_items: dict): - pass + + # 移除订阅 + + def delete_subscribe(self, del_items: Dict[int, int]): + ''' + 删除订阅 + :param del_items: 数据库id为键,bgm条目id为值 + ''' + args = [i for i in del_items.keys()] + for arg in args: + subscribe_id = int(arg) + subscribe = self.subscribeoper.get(subscribe_id) + if subscribe: + self.subscribeoper.delete(subscribe_id) + # 统计订阅 + self.subscribehelper.sub_done_async( + {"tmdbid": subscribe.tmdbid, "doubanid": subscribe.doubanid} + ) + # 发送通知 + self.post_message( + mtype=NotificationType.Subscribe, + title=f"{subscribe.name}({subscribe.year}) 第{subscribe.season}季 已取消订阅", + text="原因: 未在Bangumi收藏中找到该条目\n" + + f"订阅用户: {subscribe.username}\n" + + f"创建时间: {subscribe.date}", + image=subscribe.backdrop, + ) @staticmethod def are_dates(date_str1, date_str2, threshold_days: int = 7) -> bool: @@ -488,7 +529,7 @@ class BangumiColl(_PluginBase): 对比两个日期字符串是否接近 :param date_str1: 第一个日期字符串,格式为'YYYY-MM-DD' :param date_str2: 第二个日期字符串,格式为'YYYY-MM-DD' - :param threshold_days: 阈值天数,默认为1天 + :param threshold_days: 阈值天数,默认为7天 :return: 如果两个日期之间的差异小于等于阈值天数,则返回True,否则返回False """ # 将日期字符串转换为datetime对象