diff --git a/src/module/core/sub_thread.py b/src/module/core/sub_thread.py index 28149549..ad1767c4 100644 --- a/src/module/core/sub_thread.py +++ b/src/module/core/sub_thread.py @@ -52,6 +52,9 @@ class RenameThread(ProgramStatus): while not self.stop_event.is_set(): with Renamer() as renamer: renamed_info = renamer.rename() + with PostNotification() as notifier: + for info in renamed_info: + notifier.send_msg(info) self.stop_event.wait(settings.program.rename_time) def rename_start(self): diff --git a/src/module/manager/renamer.py b/src/module/manager/renamer.py index 01e6d188..0238bace 100644 --- a/src/module/manager/renamer.py +++ b/src/module/manager/renamer.py @@ -3,10 +3,8 @@ import logging from module.downloader import DownloadClient from module.parser import TitleParser -# from module.network import PostNotification from module.models import SubtitleFile, EpisodeFile, Notification from module.conf import settings -# from module.database import BangumiDatabase logger = logging.getLogger(__name__) @@ -47,24 +45,6 @@ class Renamer(DownloadClient): logger.error(f"[Renamer] Unknown rename method: {method}") return file_info.media_path - # @staticmethod - # def send_notification(bangumi_name, ep: EpisodeFile): - # with BangumiDatabase() as db: - # poster_path = db.match_poster(bangumi_name) - # poster_link = "https://mikanani.me" + poster_path - # n = Notification( - # official_title=bangumi_name, - # season=ep.season, - # episode=ep.episode, - # poster_link=poster_link, - # ) - # with PostNotification() as notificator: - # status = notificator.send_msg(n) - # if status: - # logger.info(f"[Renamer] Notification sent: {ep.title} S{ep.season}E{ep.episode}") - # else: - # logger.warning(f"[Renamer] Notification failed: {ep.title} S{ep.season}E{ep.episode}") - def rename_file( self, torrent_name: str, @@ -87,9 +67,12 @@ class Renamer(DownloadClient): _hash=_hash, old_path=media_path, new_path=new_path ) if renamed: - # if settings.notification.enable: - # self.send_notification(bangumi_name, ep) - return ep + n = Notification( + official_title=bangumi_name, + season=ep.season, + episode=ep.episode, + ) + return n else: logger.warning(f"[Renamer] {media_path} parse failed") if settings.bangumi_manage.remove_bad_torrent: @@ -169,9 +152,9 @@ class Renamer(DownloadClient): } # Rename single media file if len(media_list) == 1: - ep_info = self.rename_file(media_path=media_list[0], **kwargs) - if ep_info: - renamed_info.append(ep_info) + notify_info = self.rename_file(media_path=media_list[0], **kwargs) + if notify_info: + renamed_info.append(notify_info) # Rename subtitle file if len(subtitle_list) > 0: self.rename_subtitles(subtitle_list=subtitle_list, **kwargs) diff --git a/src/module/models/bangumi.py b/src/module/models/bangumi.py index fb9c1495..f1c03369 100644 --- a/src/module/models/bangumi.py +++ b/src/module/models/bangumi.py @@ -28,7 +28,6 @@ class Notification(BaseModel): official_title: str = Field(..., alias="official_title", title="番剧名") season: int = Field(..., alias="season", title="番剧季度") episode: int = Field(..., alias="episode", title="番剧集数") - poster_link: str | None = Field(None, alias="poster_link", title="番剧海报链接") @dataclass diff --git a/src/module/notification/notification.py b/src/module/notification/notification.py index 059b2699..2bb3e8cf 100644 --- a/src/module/notification/notification.py +++ b/src/module/notification/notification.py @@ -4,16 +4,13 @@ from .plugin import * from module.models import Notification from module.conf import settings +from module.database import BangumiDatabase logger = logging.getLogger(__name__) -type = settings.notification.type -token = settings.notification.token -chat_id = settings.notification.chat_id - -def getClient(): +def getClient(type=settings.notification.type): if type.lower() == "telegram": return TelegramNotification elif type.lower() == "server-chan": @@ -25,15 +22,37 @@ def getClient(): class PostNotification(getClient()): - def send_msg(self, info: Notification) -> bool: - text = ( - f"番剧名称:{info.official_title}\n" - f"季度: 第{info.season}季\n" - f"更新集数: 第{info.episode}集\n" - f"{info.poster_link}\n" + def __init__(self): + super().__init__( + token=settings.notification.token, + chat_id=settings.notification.chat_id ) + + @staticmethod + def _gen_message(notify: Notification) -> str: + with BangumiDatabase() as db: + poster_path = db.match_poster(notify.official_title) + if poster_path: + poster_link = "https://mikanani.me" + poster_path + text = f""" + 番剧名称:{info.official_title}\n + 季度: 第{info.season}季\n + 更新集数: 第{info.episode}集\n + {poster_link}\n + """ + else: + text = """ + 番剧名称:{info.official_title}\n + 季度: 第{info.season}季\n + 更新集数: 第{info.episode}集\n + """ + return text + + def send_msg(self, notify: Notification) -> bool: + text = self._gen_message(notify) try: - return self.post_msg(text) + self.post_msg(text) + logger.debug(f"Send notification: {text}") except Exception as e: logger.warning(f"Failed to send notification: {e}") return False @@ -44,7 +63,6 @@ if __name__ == "__main__": official_title="魔法纪录 魔法少女小圆外传", season=2, episode=1, - poster_link="https://mikanani.me/images/Bangumi/202107/3788b33f.jpg", ) with PostNotification() as client: client.send_msg(info) diff --git a/src/module/notification/plugin/bark.py b/src/module/notification/plugin/bark.py index 4d52d1c8..f405ab4b 100644 --- a/src/module/notification/plugin/bark.py +++ b/src/module/notification/plugin/bark.py @@ -1,7 +1,12 @@ +import logging from module.network import RequestContent + +logger = logging.getLogger(__name__) + + class BarkNotification(RequestContent): - def __init__(self): + def __init__(self, token, **kwargs): super().__init__() self.token = token self.notification_url = "https://api.day.app/push" @@ -10,4 +15,4 @@ class BarkNotification(RequestContent): data = {"title": "AutoBangumi 番剧更新", "body": text, "device_key": self.token} resp = self.post_data(self.notification_url, data) logger.debug(f"Bark notification: {resp.status_code}") - return resp.status_code == 200 \ No newline at end of file + return resp.status_code == 200 diff --git a/src/module/notification/plugin/server_chan.py b/src/module/notification/plugin/server_chan.py index 65f869ca..5b4b32d0 100644 --- a/src/module/notification/plugin/server_chan.py +++ b/src/module/notification/plugin/server_chan.py @@ -1,10 +1,14 @@ +import logging + from module.network import RequestContent +logger = logging.getLogger(__name__) + class ServerChanNotification(RequestContent): """Server酱推送""" - def __init__(self): + def __init__(self, token, **kwargs): super().__init__() self.notification_url = f"https://sctapi.ftqq.com/{token}.send" @@ -15,4 +19,4 @@ class ServerChanNotification(RequestContent): } resp = self.post_data(self.notification_url, data) logger.debug(f"ServerChan notification: {resp.status_code}") - return resp.status_code == 200 \ No newline at end of file + return resp.status_code == 200 diff --git a/src/module/notification/plugin/slack.py b/src/module/notification/plugin/slack.py index bafa3c93..1773e85d 100644 --- a/src/module/notification/plugin/slack.py +++ b/src/module/notification/plugin/slack.py @@ -1,5 +1,12 @@ -class BarkNotification(RequestContent): - def __init__(self): +import logging + +from module.network import RequestContent + +logger = logging.getLogger(__name__) + + +class SlackNotification(RequestContent): + def __init__(self, token, **kwargs): super().__init__() self.token = token self.notification_url = "https://api.day.app/push" diff --git a/src/module/notification/plugin/telegram.py b/src/module/notification/plugin/telegram.py index c5a691e5..71e90c16 100644 --- a/src/module/notification/plugin/telegram.py +++ b/src/module/notification/plugin/telegram.py @@ -1,7 +1,12 @@ +import logging + from module.network.request_contents import RequestContent +logger = logging.getLogger(__name__) + + class TelegramNotification(RequestContent): - def __init__(self): + def __init__(self, token, chat_id): super().__init__() self.notification_url = f"https://api.telegram.org/bot{token}/sendMessage" self.chat_id = chat_id @@ -14,4 +19,4 @@ class TelegramNotification(RequestContent): } resp = self.post_data(self.notification_url, data) logger.debug(f"Telegram notification: {resp.status_code}") - return resp.status_code == 200 \ No newline at end of file + return resp.status_code == 200