diff --git a/app/modules/__init__.py b/app/modules/__init__.py index 6b723e46..8bdc51b6 100644 --- a/app/modules/__init__.py +++ b/app/modules/__init__.py @@ -1,7 +1,7 @@ from abc import abstractmethod, ABCMeta -from typing import Tuple, Union, Dict, Any, Optional +from typing import Dict, Any, Optional, Generic, Tuple, Union, TypeVar -from app.schemas import Notification, MessageChannel, NotificationConf, MediaServerConf +from app.schemas import Notification, MessageChannel, NotificationConf, MediaServerConf, DownloaderConf class _ModuleBase(metaclass=ABCMeta): @@ -49,35 +49,46 @@ class _ModuleBase(metaclass=ABCMeta): pass -class _MessageBase: +# 定义一个泛型 T,用于表示具体的配置类型 +TConf = TypeVar("TConf") + + +class ConfManagerBase(Generic[TConf]): """ - 消息基类 + 通用管理基类,支持配置管理和实例管理 """ - _channel: MessageChannel = None - _configs: Dict[str, NotificationConf] = {} - _clients: Dict[str, Any] = {} + _configs: Dict[str, TConf] = {} + _instances: Dict[str, Any] = {} - def get_client(self, name: str) -> Optional[Any]: + def get_instance(self, name: str) -> Optional[Any]: """ - 获取客户端 + 获取实例 (如服务/客户端) """ if not name: return None - return self._clients.get(name) + return self._instances.get(name) - def get_config(self, name: str, ctype: str = None) -> Optional[NotificationConf]: + def get_config(self, name: str, ctype: str = None) -> Optional[TConf]: """ - 获取配置 + 获取配置,支持类型过滤 """ if not name: return None conf = self._configs.get(name) if not ctype: return conf - return conf if conf.type == ctype else None + return conf if getattr(conf, "type", None) == ctype else None - def checkMessage(self, message: Notification, source: str = None) -> bool: + +class _MessageBase(ConfManagerBase[NotificationConf]): + """ + 消息基类,继承了通用的配置和实例管理功能,指定配置类型为 NotificationConf + """ + + _channel: MessageChannel = None + + def check_message(self, message: Notification, source: str = None) -> bool: """ 检查消息渠道及消息类型,如不符合则不处理 """ @@ -97,45 +108,25 @@ class _MessageBase: return True -class _DownloaderBase: +class _DownloaderBase(ConfManagerBase[DownloaderConf]): """ 下载器基类 """ - _servers: Dict[str, Any] = {} _default_server: Any = None _default_server_name: str = None - def get_server(self, name: str = None) -> Optional[Any]: + def get_instance(self, name: str = None) -> Optional[Any]: """ - 获取服务器,name为空则返回默认服务器 + 获取实例,name为空时,返回默认实例 """ if name: - return self._servers.get(name) + return self.get_instance(name) return self._default_server -class _MediaServerBase: +class _MediaServerBase(ConfManagerBase[MediaServerConf]): """ 媒体服务器基类 """ - - _servers: Dict[str, Any] = {} - _configs: Dict[str, MediaServerConf] = {} - - def get_server(self, name: str) -> Optional[Any]: - """ - 获取Plex服务器 - """ - return self._servers.get(name) - - def get_config(self, name: str, mtype: str = None) -> Optional[MediaServerConf]: - """ - 获取配置 - """ - if not name: - return None - conf = self._configs.get(name) - if not mtype: - return conf - return conf if conf.type == mtype else None + pass diff --git a/app/modules/emby/__init__.py b/app/modules/emby/__init__.py index d0b345fa..734be30f 100644 --- a/app/modules/emby/__init__.py +++ b/app/modules/emby/__init__.py @@ -17,7 +17,7 @@ class EmbyModule(_ModuleBase, _MediaServerBase): 初始化模块 """ # 读取媒体服务器配置 - self._servers: Dict[str, Emby] = {} + self._instances: Dict[str, Emby] = {} self._configs: Dict[str, MediaServerConf] = {} mediaservers = MediaServerHelper().get_mediaservers() if not mediaservers: @@ -25,7 +25,7 @@ class EmbyModule(_ModuleBase, _MediaServerBase): for server in mediaservers: if server.type == "emby" and server.enabled: self._configs[server.name] = server - self._servers[server.name] = Emby(**server.config, sync_libraries=server.sync_libraries) + self._instances[server.name] = Emby(**server.config, sync_libraries=server.sync_libraries) @staticmethod def get_name() -> str: @@ -38,9 +38,9 @@ class EmbyModule(_ModuleBase, _MediaServerBase): """ 测试模块连接性 """ - if not self._servers: + if not self._instances: return None - for name, server in self._servers.items(): + for name, server in self._instances.items(): if server.is_inactive(): server.reconnect() if not server.get_user(): @@ -55,7 +55,7 @@ class EmbyModule(_ModuleBase, _MediaServerBase): 定时任务,每10分钟调用一次 """ # 定时重连 - for name, server in self._servers.items(): + for name, server in self._instances.items(): if server.is_inactive(): logger.info(f"Emby服务器 {name} 连接断开,尝试重连 ...") server.reconnect() @@ -68,7 +68,7 @@ class EmbyModule(_ModuleBase, _MediaServerBase): :return: token or None """ # Emby认证 - for server in self._servers.values(): + for server in self._instances.values(): result = server.authenticate(name, password) if result: return result @@ -87,7 +87,7 @@ class EmbyModule(_ModuleBase, _MediaServerBase): server_config: MediaServerConf = self.get_config(source, 'emby') if not server_config: return None - server: Emby = self.get_server(source) + server: Emby = self.get_instance(source) if not server: return None return server.get_webhook_message(form, args) @@ -95,7 +95,7 @@ class EmbyModule(_ModuleBase, _MediaServerBase): for conf in self._configs.values(): if conf.type != "emby": continue - server = self.get_server(conf.name) + server = self.get_instance(conf.name) if server: result = server.get_webhook_message(form, args) if result: @@ -109,7 +109,7 @@ class EmbyModule(_ModuleBase, _MediaServerBase): :param itemid: 媒体服务器ItemID :return: 如不存在返回None,存在时返回信息,包括每季已存在所有集{type: movie/tv, seasons: {season: [episodes]}} """ - for name, server in self._servers.items(): + for name, server in self._instances.items(): if mediainfo.type == MediaType.MOVIE: if itemid: movie = server.get_iteminfo(itemid) @@ -156,12 +156,12 @@ class EmbyModule(_ModuleBase, _MediaServerBase): 媒体数量统计 """ if server: - server: Emby = self.get_server(server) + server: Emby = self.get_instance(server) if not server: return None servers = [server] else: - servers = self._servers.values() + servers = self._instances.values() media_statistics = [] for server in servers: media_statistic = server.get_medias_count() @@ -177,7 +177,7 @@ class EmbyModule(_ModuleBase, _MediaServerBase): """ 媒体库列表 """ - server: Emby = self.get_server(server) + server: Emby = self.get_instance(server) if server: return server.get_librarys(username=username, hidden=hidden) return None @@ -186,7 +186,7 @@ class EmbyModule(_ModuleBase, _MediaServerBase): """ 媒体库项目列表 """ - server: Emby = self.get_server(server) + server: Emby = self.get_instance(server) if server: return server.get_items(library_id, start_index, limit) return None @@ -195,7 +195,7 @@ class EmbyModule(_ModuleBase, _MediaServerBase): """ 媒体库项目详情 """ - server: Emby = self.get_server(server) + server: Emby = self.get_instance(server) if server: return server.get_iteminfo(item_id) return None @@ -205,7 +205,7 @@ class EmbyModule(_ModuleBase, _MediaServerBase): """ 获取剧集信息 """ - server: Emby = self.get_server(server) + server: Emby = self.get_instance(server) if not server: return None _, seasoninfo = server.get_tv_episodes(item_id=item_id) @@ -221,7 +221,7 @@ class EmbyModule(_ModuleBase, _MediaServerBase): """ 获取媒体服务器正在播放信息 """ - server: Emby = self.get_server(server) + server: Emby = self.get_instance(server) if not server: return [] return server.get_resume(num=count, username=username) @@ -230,7 +230,7 @@ class EmbyModule(_ModuleBase, _MediaServerBase): """ 获取媒体库播放地址 """ - server: Emby = self.get_server(server) + server: Emby = self.get_instance(server) if not server: return None return server.get_play_url(item_id) @@ -240,7 +240,7 @@ class EmbyModule(_ModuleBase, _MediaServerBase): """ 获取媒体服务器最新入库条目 """ - server: Emby = self.get_server(server) + server: Emby = self.get_instance(server) if not server: return [] return server.get_latest(num=count, username=username) diff --git a/app/modules/jellyfin/__init__.py b/app/modules/jellyfin/__init__.py index b3ccac7b..e0ec0e71 100644 --- a/app/modules/jellyfin/__init__.py +++ b/app/modules/jellyfin/__init__.py @@ -17,7 +17,7 @@ class JellyfinModule(_ModuleBase, _MediaServerBase): 初始化模块 """ # 读取媒体服务器配置 - self._servers: Dict[str, Jellyfin] = {} + self._instances: Dict[str, Jellyfin] = {} self._configs: Dict[str, MediaServerConf] = {} mediaservers = MediaServerHelper().get_mediaservers() if not mediaservers: @@ -25,7 +25,7 @@ class JellyfinModule(_ModuleBase, _MediaServerBase): for server in mediaservers: if server.type == "jellyfin" and server.enabled: self._configs[server.name] = server - self._servers[server.name] = Jellyfin(**server.config, sync_libraries=server.sync_libraries) + self._instances[server.name] = Jellyfin(**server.config, sync_libraries=server.sync_libraries) @staticmethod def get_name() -> str: @@ -39,7 +39,7 @@ class JellyfinModule(_ModuleBase, _MediaServerBase): 定时任务,每10分钟调用一次 """ # 定时重连 - for name, server in self._servers.items(): + for name, server in self._instances.items(): if server.is_inactive(): logger.info(f"Jellyfin {name} 服务器连接断开,尝试重连 ...") server.reconnect() @@ -51,9 +51,9 @@ class JellyfinModule(_ModuleBase, _MediaServerBase): """ 测试模块连接性 """ - if not self._servers: + if not self._instances: return None - for name, server in self._servers.items(): + for name, server in self._instances.items(): if server.is_inactive(): server.reconnect() if not server.get_user(): @@ -68,7 +68,7 @@ class JellyfinModule(_ModuleBase, _MediaServerBase): :return: Token or None """ # Jellyfin认证 - for server in self._servers.values(): + for server in self._instances.values(): result = server.authenticate(name, password) if result: return result @@ -87,7 +87,7 @@ class JellyfinModule(_ModuleBase, _MediaServerBase): server_config: MediaServerConf = self.get_config(source, 'jellyfin') if not server_config: return None - server: Jellyfin = self.get_server(source) + server: Jellyfin = self.get_instance(source) if not server: return None return server.get_webhook_message(body) @@ -95,7 +95,7 @@ class JellyfinModule(_ModuleBase, _MediaServerBase): for conf in self._configs.values(): if conf.type != "jellyfin": continue - server = self.get_server(conf.name) + server = self.get_instance(conf.name) if server: result = server.get_webhook_message(body) if result: @@ -109,7 +109,7 @@ class JellyfinModule(_ModuleBase, _MediaServerBase): :param itemid: 媒体服务器ItemID :return: 如不存在返回None,存在时返回信息,包括每季已存在所有集{type: movie/tv, seasons: {season: [episodes]}} """ - for name, server in self._servers.items(): + for name, server in self._instances.items(): if mediainfo.type == MediaType.MOVIE: if itemid: movie = server.get_iteminfo(itemid) @@ -154,12 +154,12 @@ class JellyfinModule(_ModuleBase, _MediaServerBase): 媒体数量统计 """ if server: - server: Jellyfin = self.get_server(server) + server: Jellyfin = self.get_instance(server) if not server: return None servers = [server] else: - servers = self._servers.values() + servers = self._instances.values() media_statistics = [] for server in servers: media_statistic = server.get_medias_count() @@ -175,16 +175,17 @@ class JellyfinModule(_ModuleBase, _MediaServerBase): """ 媒体库列表 """ - server: Jellyfin = self.get_server(server) + server: Jellyfin = self.get_instance(server) if server: return server.get_librarys(username=username, hidden=hidden) return None - def mediaserver_items(self, server: str, library_id: str, start_index: int = 0, limit: int = 100) -> Optional[Generator]: + def mediaserver_items(self, server: str, library_id: str, start_index: int = 0, limit: int = 100) -> Optional[ + Generator]: """ 媒体库项目列表 """ - server: Jellyfin = self.get_server(server) + server: Jellyfin = self.get_instance(server) if server: return server.get_items(library_id, start_index, limit) return None @@ -193,7 +194,7 @@ class JellyfinModule(_ModuleBase, _MediaServerBase): """ 媒体库项目详情 """ - server: Jellyfin = self.get_server(server) + server: Jellyfin = self.get_instance(server) if server: return server.get_iteminfo(item_id) return None @@ -203,7 +204,7 @@ class JellyfinModule(_ModuleBase, _MediaServerBase): """ 获取剧集信息 """ - server: Jellyfin = self.get_server(server) + server: Jellyfin = self.get_instance(server) if not server: return None _, seasoninfo = server.get_tv_episodes(item_id=item_id) @@ -219,7 +220,7 @@ class JellyfinModule(_ModuleBase, _MediaServerBase): """ 获取媒体服务器正在播放信息 """ - server: Jellyfin = self.get_server(server) + server: Jellyfin = self.get_instance(server) if not server: return [] return server.get_resume(num=count, username=username) @@ -228,7 +229,7 @@ class JellyfinModule(_ModuleBase, _MediaServerBase): """ 获取媒体库播放地址 """ - server: Jellyfin = self.get_server(server) + server: Jellyfin = self.get_instance(server) if not server: return None return server.get_play_url(item_id) @@ -238,7 +239,7 @@ class JellyfinModule(_ModuleBase, _MediaServerBase): """ 获取媒体服务器最新入库条目 """ - server: Jellyfin = self.get_server(server) + server: Jellyfin = self.get_instance(server) if not server: return [] return server.get_latest(num=count, username=username) diff --git a/app/modules/plex/__init__.py b/app/modules/plex/__init__.py index 013e9273..bda5dc99 100644 --- a/app/modules/plex/__init__.py +++ b/app/modules/plex/__init__.py @@ -17,7 +17,7 @@ class PlexModule(_ModuleBase, _MediaServerBase): 初始化模块 """ # 读取媒体服务器配置 - self._servers: Dict[str, Plex] = {} + self._instances: Dict[str, Plex] = {} self._configs: Dict[str, MediaServerConf] = {} mediaservers = MediaServerHelper().get_mediaservers() if not mediaservers: @@ -25,7 +25,7 @@ class PlexModule(_ModuleBase, _MediaServerBase): for server in mediaservers: if server.type == "plex" and server.enabled: self._configs[server.name] = server - self._servers[server.name] = Plex(**server.config, sync_libraries=server.sync_libraries) + self._instances[server.name] = Plex(**server.config, sync_libraries=server.sync_libraries) @staticmethod def get_name() -> str: @@ -38,9 +38,9 @@ class PlexModule(_ModuleBase, _MediaServerBase): """ 测试模块连接性 """ - if not self._servers: + if not self._instances: return None - for name, server in self._servers.items(): + for name, server in self._instances.items(): if server.is_inactive(): server.reconnect() if not server.get_librarys(): @@ -55,7 +55,7 @@ class PlexModule(_ModuleBase, _MediaServerBase): 定时任务,每10分钟调用一次 """ # 定时重连 - for name, server in self._servers.items(): + for name, server in self._instances.items(): if server.is_inactive(): logger.info(f"Plex {name} 服务器连接断开,尝试重连 ...") server.reconnect() @@ -73,7 +73,7 @@ class PlexModule(_ModuleBase, _MediaServerBase): server_config: MediaServerConf = self.get_config(source, 'plex') if not server_config: return None - server: Plex = self.get_server(source) + server: Plex = self.get_instance(source) if not server: return None return server.get_webhook_message(body) @@ -81,7 +81,7 @@ class PlexModule(_ModuleBase, _MediaServerBase): for conf in self._configs.values(): if conf.type != "plex": continue - server = self.get_server(conf.name) + server = self.get_instance(conf.name) if server: result = server.get_webhook_message(body) if result: @@ -95,7 +95,7 @@ class PlexModule(_ModuleBase, _MediaServerBase): :param itemid: 媒体服务器ItemID :return: 如不存在返回None,存在时返回信息,包括每季已存在所有集{type: movie/tv, seasons: {season: [episodes]}} """ - for name, server in self._servers.items(): + for name, server in self._instances.items(): if mediainfo.type == MediaType.MOVIE: if itemid: movie = server.get_iteminfo(itemid) @@ -144,12 +144,12 @@ class PlexModule(_ModuleBase, _MediaServerBase): 媒体数量统计 """ if server: - server: Plex = self.get_server(server) + server: Plex = self.get_instance(server) if not server: return None servers = [server] else: - servers = self._servers.values() + servers = self._instances.values() media_statistics = [] for server in servers: media_statistic = server.get_medias_count() @@ -163,7 +163,7 @@ class PlexModule(_ModuleBase, _MediaServerBase): """ 媒体库列表 """ - server: Plex = self.get_server(server) + server: Plex = self.get_instance(server) if server: return server.get_librarys(hidden) return None @@ -172,7 +172,7 @@ class PlexModule(_ModuleBase, _MediaServerBase): """ 媒体库项目列表 """ - server: Plex = self.get_server(server) + server: Plex = self.get_instance(server) if server: return server.get_items(library_id, start_index, limit) return None @@ -181,7 +181,7 @@ class PlexModule(_ModuleBase, _MediaServerBase): """ 媒体库项目详情 """ - server: Plex = self.get_server(server) + server: Plex = self.get_instance(server) if server: return server.get_iteminfo(item_id) return None @@ -191,7 +191,7 @@ class PlexModule(_ModuleBase, _MediaServerBase): """ 获取剧集信息 """ - server: Plex = self.get_server(server) + server: Plex = self.get_instance(server) if not server: return None _, seasoninfo = server.get_tv_episodes(item_id=item_id) @@ -206,7 +206,7 @@ class PlexModule(_ModuleBase, _MediaServerBase): """ 获取媒体服务器正在播放信息 """ - server: Plex = self.get_server(server) + server: Plex = self.get_instance(server) if not server: return [] return server.get_resume(num=count) @@ -215,7 +215,7 @@ class PlexModule(_ModuleBase, _MediaServerBase): """ 获取媒体服务器最新入库条目 """ - server: Plex = self.get_server(server) + server: Plex = self.get_instance(server) if not server: return [] return server.get_latest(num=count) @@ -224,7 +224,7 @@ class PlexModule(_ModuleBase, _MediaServerBase): """ 获取媒体库播放地址 """ - server: Plex = self.get_server(server) + server: Plex = self.get_instance(server) if not server: return None return server.get_play_url(item_id) diff --git a/app/modules/qbittorrent/__init__.py b/app/modules/qbittorrent/__init__.py index 4a2ce5be..ab3707a5 100644 --- a/app/modules/qbittorrent/__init__.py +++ b/app/modules/qbittorrent/__init__.py @@ -25,16 +25,16 @@ class QbittorrentModule(_ModuleBase, _DownloaderBase): 初始化模块 """ # 读取下载器配置 - self._servers: Dict[str, Qbittorrent] = {} - downloaders = DownloaderHelper().get_downloaders() - if not downloaders: + self._instances: Dict[str, Qbittorrent] = {} + configs = DownloaderHelper().get_downloader_conf() + if not configs: return - for server in downloaders: - if server.type == "qbittorrent" and server.enabled: - self._servers[server.name] = Qbittorrent(**server.config) - if server.default: - self._default_server_name = server.name - self._default_server = self._servers[server.name] + for conf in configs: + if conf.type == "qbittorrent" and conf.enabled: + self._instances[conf.name] = Qbittorrent(**conf.config) + if conf.default: + self._default_server_name = conf.name + self._default_server = self._instances[conf.name] @staticmethod def get_name() -> str: @@ -47,9 +47,9 @@ class QbittorrentModule(_ModuleBase, _DownloaderBase): """ 测试模块连接性 """ - if not self._servers: + if not self._instances: return None - for name, server in self._servers.items(): + for name, server in self._instances.items(): if server.is_inactive(): server.reconnect() if not server.transfer_info(): @@ -63,7 +63,7 @@ class QbittorrentModule(_ModuleBase, _DownloaderBase): """ 定时任务,每10分钟调用一次 """ - for name, server in self._servers.items(): + for name, server in self._instances.items(): if server.is_inactive(): logger.info(f"Qbittorrent下载器 {name} 连接断开,尝试重连 ...") server.reconnect() @@ -103,7 +103,7 @@ class QbittorrentModule(_ModuleBase, _DownloaderBase): return None, None, f"种子文件不存在:{content}" # 获取下载器 - server: Qbittorrent = self.get_server(downloader) + server: Qbittorrent = self.get_instance(downloader) if not server: return None @@ -201,7 +201,7 @@ class QbittorrentModule(_ModuleBase, _DownloaderBase): :return: 下载器中符合状态的种子列表 """ # 获取下载器 - server: Qbittorrent = self.get_server(downloader) + server: Qbittorrent = self.get_instance(downloader) if not server: return None @@ -274,7 +274,7 @@ class QbittorrentModule(_ModuleBase, _DownloaderBase): :param downloader: 下载器 :param transfer_type: 整理方式 """ - server: Qbittorrent = self.get_server(downloader) + server: Qbittorrent = self.get_instance(downloader) if not server: return None server.set_torrents_tag(ids=hashs, tags=['已整理']) @@ -298,7 +298,7 @@ class QbittorrentModule(_ModuleBase, _DownloaderBase): :param downloader: 下载器 :return: bool """ - server: Qbittorrent = self.get_server(downloader) + server: Qbittorrent = self.get_instance(downloader) if not server: return None return server.delete_torrents(delete_file=delete_file, ids=hashs) @@ -311,7 +311,7 @@ class QbittorrentModule(_ModuleBase, _DownloaderBase): :param downloader: 下载器 :return: bool """ - server: Qbittorrent = self.get_server(downloader) + server: Qbittorrent = self.get_instance(downloader) if not server: return None return server.start_torrents(ids=hashs) @@ -323,7 +323,7 @@ class QbittorrentModule(_ModuleBase, _DownloaderBase): :param downloader: 下载器 :return: bool """ - server: Qbittorrent = self.get_server(downloader) + server: Qbittorrent = self.get_instance(downloader) if not server: return None return server.stop_torrents(ids=hashs) @@ -332,7 +332,7 @@ class QbittorrentModule(_ModuleBase, _DownloaderBase): """ 获取种子文件列表 """ - server: Qbittorrent = self.get_server(downloader) + server: Qbittorrent = self.get_instance(downloader) if not server: return None return server.get_files(tid=tid) @@ -342,12 +342,12 @@ class QbittorrentModule(_ModuleBase, _DownloaderBase): 下载器信息 """ if downloader: - server: Qbittorrent = self.get_server(downloader) + server: Qbittorrent = self.get_instance(downloader) if not server: return None servers = [server] else: - servers = self._servers.values() + servers = self._instances.values() # 调用Qbittorrent API查询实时信息 ret_info = [] for server in servers: diff --git a/app/modules/slack/__init__.py b/app/modules/slack/__init__.py index 7d129aad..e9f9c544 100644 --- a/app/modules/slack/__init__.py +++ b/app/modules/slack/__init__.py @@ -21,11 +21,11 @@ class SlackModule(_ModuleBase, _MessageBase): if not clients: return self._configs = {} - self._clients = {} + self._instances = {} for client in clients: if client.type == "slack" and client.enabled: self._configs[client.name] = client - self._clients[client.name] = Slack(**client.config, name=client.name) + self._instances[client.name] = Slack(**client.config, name=client.name) @staticmethod def get_name() -> str: @@ -35,16 +35,16 @@ class SlackModule(_ModuleBase, _MessageBase): """ 停止模块 """ - for client in self._clients.values(): + for client in self._instances.values(): client.stop() def test(self) -> Optional[Tuple[bool, str]]: """ 测试模块连接性 """ - if not self._clients: + if not self._instances: return None - for name, client in self._clients.items(): + for name, client in self._instances.items(): state = client.get_state() if not state: return False, f"Slack {name} 未就续" @@ -223,7 +223,7 @@ class SlackModule(_ModuleBase, _MessageBase): :return: 成功或失败 """ for conf in self._configs.values(): - if not self.checkMessage(message, conf.name): + if not self.check_message(message, conf.name): continue targets = message.targets userid = message.userid @@ -232,7 +232,7 @@ class SlackModule(_ModuleBase, _MessageBase): if not userid: logger.warn(f"用户没有指定 Slack用户ID,消息无法发送") return - client: Slack = self.get_client(conf.name) + client: Slack = self.get_instance(conf.name) if client: client.send_msg(title=message.title, text=message.text, image=message.image, userid=userid, link=message.link) @@ -245,9 +245,9 @@ class SlackModule(_ModuleBase, _MessageBase): :return: 成功或失败 """ for conf in self._configs.values(): - if not self.checkMessage(message, conf.name): + if not self.check_message(message, conf.name): continue - client: Slack = self.get_client(conf.name) + client: Slack = self.get_instance(conf.name) if client: client.send_medias_msg(title=message.title, medias=medias, userid=message.userid) @@ -259,9 +259,9 @@ class SlackModule(_ModuleBase, _MessageBase): :return: 成功或失败 """ for conf in self._configs.values(): - if not self.checkMessage(message, conf.name): + if not self.check_message(message, conf.name): continue - client: Slack = self.get_client(conf.name) + client: Slack = self.get_instance(conf.name) if client: client.send_torrents_msg(title=message.title, torrents=torrents, userid=message.userid) diff --git a/app/modules/synologychat/__init__.py b/app/modules/synologychat/__init__.py index e0247bcb..588eba0b 100644 --- a/app/modules/synologychat/__init__.py +++ b/app/modules/synologychat/__init__.py @@ -18,11 +18,11 @@ class SynologyChatModule(_ModuleBase, _MessageBase): if not clients: return self._configs = {} - self._clients = {} + self._instances = {} for client in clients: if client.type == "synologychat" and client.enabled: self._configs[client.name] = client - self._clients[client.name] = SynologyChat(**client.config) + self._instances[client.name] = SynologyChat(**client.config) @staticmethod def get_name() -> str: @@ -35,9 +35,9 @@ class SynologyChatModule(_ModuleBase, _MessageBase): """ 测试模块连接性 """ - if not self._clients: + if not self._instances: return None - for name, client in self._clients.items(): + for name, client in self._instances.items(): state = client.get_state() if not state: return False, f"Synology Chat {name} 未就续" @@ -64,7 +64,7 @@ class SynologyChatModule(_ModuleBase, _MessageBase): client_config = self.get_config(source, 'synologychat') if not client_config: return None - client: SynologyChat = self.get_client(source) + client: SynologyChat = self.get_instance(source) # 解析消息 message: dict = form if not message: @@ -94,7 +94,7 @@ class SynologyChatModule(_ModuleBase, _MessageBase): :return: 成功或失败 """ for conf in self._configs.values(): - if not self.checkMessage(message, conf.name): + if not self.check_message(message, conf.name): continue targets = message.targets userid = message.userid @@ -103,7 +103,7 @@ class SynologyChatModule(_ModuleBase, _MessageBase): if not userid: logger.warn(f"用户没有指定 SynologyChat用户ID,消息无法发送") return - client: SynologyChat = self.get_client(conf.name) + client: SynologyChat = self.get_instance(conf.name) if client: client.send_msg(title=message.title, text=message.text, image=message.image, userid=userid, link=message.link) @@ -116,9 +116,9 @@ class SynologyChatModule(_ModuleBase, _MessageBase): :return: 成功或失败 """ for conf in self._configs.values(): - if not self.checkMessage(message, conf.name): + if not self.check_message(message, conf.name): continue - client: SynologyChat = self.get_client(conf.name) + client: SynologyChat = self.get_instance(conf.name) if client: client.send_medias_msg(title=message.title, medias=medias, userid=message.userid) @@ -131,9 +131,9 @@ class SynologyChatModule(_ModuleBase, _MessageBase): :return: 成功或失败 """ for conf in self._configs.values(): - if not self.checkMessage(message, conf.name): + if not self.check_message(message, conf.name): continue - client: SynologyChat = self.get_client(conf.name) + client: SynologyChat = self.get_instance(conf.name) if client: client.send_torrents_msg(title=message.title, torrents=torrents, userid=message.userid, link=message.link) diff --git a/app/modules/telegram/__init__.py b/app/modules/telegram/__init__.py index b4421f2f..4696302a 100644 --- a/app/modules/telegram/__init__.py +++ b/app/modules/telegram/__init__.py @@ -20,11 +20,11 @@ class TelegramModule(_ModuleBase, _MessageBase): if not clients: return self._configs = {} - self._clients = {} + self._instances = {} for client in clients: if client.type == "telegram" and client.enabled: self._configs[client.name] = client - self._clients[client.name] = Telegram(**client.config, name=client.name) + self._instances[client.name] = Telegram(**client.config, name=client.name) @staticmethod def get_name() -> str: @@ -34,16 +34,16 @@ class TelegramModule(_ModuleBase, _MessageBase): """ 停止模块 """ - for client in self._clients.values(): + for client in self._instances.values(): client.stop() def test(self) -> Optional[Tuple[bool, str]]: """ 测试模块连接性 """ - if not self._clients: + if not self._instances: return None - for name, client in self._clients.items(): + for name, client in self._instances.items(): state = client.get_state() if not state: return False, f"Telegram {name} 未就续" @@ -92,7 +92,7 @@ class TelegramModule(_ModuleBase, _MessageBase): client_config = self.get_config(source, 'telegram') if not client_config: return None - client: Telegram = self.get_client(source) + client: Telegram = self.get_instance(source) # 校验token token = args.get("token") if not token or token != settings.API_TOKEN: @@ -136,7 +136,7 @@ class TelegramModule(_ModuleBase, _MessageBase): :return: 成功或失败 """ for conf in self._configs.values(): - if not self.checkMessage(message, conf.name): + if not self.check_message(message, conf.name): continue targets = message.targets userid = message.userid @@ -145,7 +145,7 @@ class TelegramModule(_ModuleBase, _MessageBase): if not userid: logger.warn(f"用户没有指定 Telegram用户ID,消息无法发送") return - client: Telegram = self.get_client(conf.name) + client: Telegram = self.get_instance(conf.name) if client: client.send_msg(title=message.title, text=message.text, image=message.image, userid=userid, link=message.link) @@ -158,9 +158,9 @@ class TelegramModule(_ModuleBase, _MessageBase): :return: 成功或失败 """ for conf in self._configs.values(): - if not self.checkMessage(message, conf.name): + if not self.check_message(message, conf.name): continue - client: Telegram = self.get_client(conf.name) + client: Telegram = self.get_instance(conf.name) if client: client.send_medias_msg(title=message.title, medias=medias, userid=message.userid, link=message.link) @@ -173,9 +173,9 @@ class TelegramModule(_ModuleBase, _MessageBase): :return: 成功或失败 """ for conf in self._configs.values(): - if not self.checkMessage(message, conf.name): + if not self.check_message(message, conf.name): continue - client: Telegram = self.get_client(conf.name) + client: Telegram = self.get_instance(conf.name) if client: client.send_torrents_msg(title=message.title, torrents=torrents, userid=message.userid, link=message.link) @@ -185,5 +185,5 @@ class TelegramModule(_ModuleBase, _MessageBase): 注册命令,实现这个函数接收系统可用的命令菜单 :param commands: 命令字典 """ - for client in self._clients.values(): + for client in self._instances.values(): client.register_commands(commands) diff --git a/app/modules/transmission/__init__.py b/app/modules/transmission/__init__.py index 0d501bd0..53f02fb5 100644 --- a/app/modules/transmission/__init__.py +++ b/app/modules/transmission/__init__.py @@ -22,16 +22,16 @@ class TransmissionModule(_ModuleBase, _DownloaderBase): def init_module(self) -> None: # 读取下载器配置 - self._servers: Dict[str, Transmission] = {} - downloaders = DownloaderHelper().get_downloaders() - if not downloaders: + self._instances: Dict[str, Transmission] = {} + configs = DownloaderHelper().get_downloader_conf() + if not configs: return - for server in downloaders: - if server.type == "transmission" and server.enabled: - self._servers[server.name] = Transmission(**server.config) - if server.default: - self._default_server_name = server.name - self._default_server = self._servers[server.name] + for conf in configs: + if conf.type == "transmission" and conf.enabled: + self._instances[conf.name] = Transmission(**conf.config) + if conf.default: + self._default_server_name = conf.name + self._default_server = self._instances[conf.name] @staticmethod def get_name() -> str: @@ -44,9 +44,9 @@ class TransmissionModule(_ModuleBase, _DownloaderBase): """ 测试模块连接性 """ - if not self._servers: + if not self._instances: return None - for name, server in self._servers.items(): + for name, server in self._instances.items(): if server.is_inactive(): server.reconnect() if not server.transfer_info(): @@ -61,7 +61,7 @@ class TransmissionModule(_ModuleBase, _DownloaderBase): 定时任务,每10分钟调用一次 """ # 定时重连 - for name, server in self._servers.items(): + for name, server in self._instances.items(): if server.is_inactive(): logger.info(f"Transmission下载器 {name} 连接断开,尝试重连 ...") server.reconnect() @@ -100,7 +100,7 @@ class TransmissionModule(_ModuleBase, _DownloaderBase): return None, None, f"种子文件不存在:{content}" # 获取下载器 - server: Transmission = self.get_server(downloader) + server: Transmission = self.get_instance(downloader) if not server: return None @@ -191,7 +191,7 @@ class TransmissionModule(_ModuleBase, _DownloaderBase): :return: 下载器中符合状态的种子列表 """ # 获取下载器 - server: Transmission = self.get_server(downloader) + server: Transmission = self.get_instance(downloader) if not server: return None ret_torrents = [] @@ -259,7 +259,7 @@ class TransmissionModule(_ModuleBase, _DownloaderBase): :param transfer_type: 整理方式 """ # 获取下载器 - server: Transmission = self.get_server(downloader) + server: Transmission = self.get_instance(downloader) if not server: return None # 获取原标签 @@ -291,7 +291,7 @@ class TransmissionModule(_ModuleBase, _DownloaderBase): :return: bool """ # 获取下载器 - server: Transmission = self.get_server(downloader) + server: Transmission = self.get_instance(downloader) if not server: return None return server.delete_torrents(delete_file=delete_file, ids=hashs) @@ -305,7 +305,7 @@ class TransmissionModule(_ModuleBase, _DownloaderBase): :return: bool """ # 获取下载器 - server: Transmission = self.get_server(downloader) + server: Transmission = self.get_instance(downloader) if not server: return None return server.start_torrents(ids=hashs) @@ -319,7 +319,7 @@ class TransmissionModule(_ModuleBase, _DownloaderBase): :return: bool """ # 获取下载器 - server: Transmission = self.get_server(downloader) + server: Transmission = self.get_instance(downloader) if not server: return None return server.start_torrents(ids=hashs) @@ -329,7 +329,7 @@ class TransmissionModule(_ModuleBase, _DownloaderBase): 获取种子文件列表 """ # 获取下载器 - server: Transmission = self.get_server(downloader) + server: Transmission = self.get_instance(downloader) if not server: return None return server.get_files(tid=tid) @@ -339,12 +339,12 @@ class TransmissionModule(_ModuleBase, _DownloaderBase): 下载器信息 """ if downloader: - server: Transmission = self.get_server(downloader) + server: Transmission = self.get_instance(downloader) if not server: return None servers = [server] else: - servers = self._servers.values() + servers = self._instances.values() # 调用Qbittorrent API查询实时信息 ret_info = [] for server in servers: diff --git a/app/modules/vocechat/__init__.py b/app/modules/vocechat/__init__.py index 031da1b6..e2d8c5be 100644 --- a/app/modules/vocechat/__init__.py +++ b/app/modules/vocechat/__init__.py @@ -20,11 +20,11 @@ class VoceChatModule(_ModuleBase, _MessageBase): if not clients: return self._configs = {} - self._clients = {} + self._instances = {} for client in clients: if client.type == "vocechat" and client.enabled: self._configs[client.name] = client - self._clients[client.name] = VoceChat(**client.config) + self._instances[client.name] = VoceChat(**client.config) @staticmethod def get_name() -> str: @@ -37,9 +37,9 @@ class VoceChatModule(_ModuleBase, _MessageBase): """ 测试模块连接性 """ - if not self._clients: + if not self._instances: return None - for name, client in self._clients.items(): + for name, client in self._instances.items(): state = client.get_state() if not state: return False, f"VoceChat {name} 未就续" @@ -122,13 +122,13 @@ class VoceChatModule(_ModuleBase, _MessageBase): :return: 成功或失败 """ for conf in self._configs.values(): - if not self.checkMessage(message, conf.name): + if not self.check_message(message, conf.name): continue targets = message.targets userid = message.userid if not message.userid and targets: userid = targets.get('telegram_userid') - client: VoceChat = self.get_client(conf.name) + client: VoceChat = self.get_instance(conf.name) if client: client.send_msg(title=message.title, text=message.text, userid=userid, link=message.link) @@ -141,9 +141,9 @@ class VoceChatModule(_ModuleBase, _MessageBase): :return: 成功或失败 """ for conf in self._configs.values(): - if not self.checkMessage(message, conf.name): + if not self.check_message(message, conf.name): continue - client: VoceChat = self.get_client(conf.name) + client: VoceChat = self.get_instance(conf.name) if client: client.send_msg(title=message.title, userid=message.userid) client.send_medias_msg(title=message.title, medias=medias, @@ -157,7 +157,7 @@ class VoceChatModule(_ModuleBase, _MessageBase): :return: 成功或失败 """ for conf in self._configs.values(): - if not self.checkMessage(message, conf.name): + if not self.check_message(message, conf.name): continue targets = message.targets userid = message.userid @@ -166,7 +166,7 @@ class VoceChatModule(_ModuleBase, _MessageBase): if not userid: logger.warn(f"用户没有指定 VoceChat用户ID,消息无法发送") return - client: VoceChat = self.get_client(conf.name) + client: VoceChat = self.get_instance(conf.name) if client: client.send_torrents_msg(title=message.title, torrents=torrents, userid=userid, link=message.link) diff --git a/app/modules/webpush/__init__.py b/app/modules/webpush/__init__.py index f158666b..72d90eb9 100644 --- a/app/modules/webpush/__init__.py +++ b/app/modules/webpush/__init__.py @@ -46,7 +46,7 @@ class WebPushModule(_ModuleBase, _MessageBase): :return: 成功或失败 """ for conf in self._configs.values(): - if not self.checkMessage(message, conf.name): + if not self.check_message(message, conf.name): continue webpush_users = conf.config.get("WEBPUSH_USERNAME") or "" if webpush_users: diff --git a/app/modules/wechat/__init__.py b/app/modules/wechat/__init__.py index 690a77e6..bbd15203 100644 --- a/app/modules/wechat/__init__.py +++ b/app/modules/wechat/__init__.py @@ -21,11 +21,11 @@ class WechatModule(_ModuleBase, _MessageBase): if not clients: return self._configs = {} - self._clients = {} + self._instances = {} for client in clients: if client.type == "wechat" and client.enabled: self._configs[client.name] = client - self._clients[client.name] = WeChat(**client.config) + self._instances[client.name] = WeChat(**client.config) @staticmethod def get_name() -> str: @@ -38,9 +38,9 @@ class WechatModule(_ModuleBase, _MessageBase): """ 测试模块连接性 """ - if not self._clients: + if not self._instances: return None - for name, client in self._clients.items(): + for name, client in self._instances.items(): state = client.get_state() if not state: return False, f"企业微信 {name} 未就续" @@ -67,7 +67,7 @@ class WechatModule(_ModuleBase, _MessageBase): client_config = self.get_config(source, 'wechat') if not client_config: return None - client: WeChat = self.get_client(source) + client: WeChat = self.get_instance(source) # URL参数 sVerifyMsgSig = args.get("msg_signature") sVerifyTimeStamp = args.get("timestamp") @@ -159,7 +159,7 @@ class WechatModule(_ModuleBase, _MessageBase): :return: 成功或失败 """ for conf in self._configs.values(): - if not self.checkMessage(message, conf.name): + if not self.check_message(message, conf.name): continue targets = message.targets userid = message.userid @@ -168,7 +168,7 @@ class WechatModule(_ModuleBase, _MessageBase): if not userid: logger.warn(f"用户没有指定 微信用户ID,消息无法发送") return - client: WeChat = self.get_client(conf.name) + client: WeChat = self.get_instance(conf.name) if client: client.send_msg(title=message.title, text=message.text, image=message.image, userid=userid, link=message.link) @@ -181,9 +181,9 @@ class WechatModule(_ModuleBase, _MessageBase): :return: 成功或失败 """ for conf in self._configs.values(): - if not self.checkMessage(message, conf.name): + if not self.check_message(message, conf.name): continue - client: WeChat = self.get_client(conf.name) + client: WeChat = self.get_instance(conf.name) if client: # 先发送标题 client.send_msg(title=message.title, userid=message.userid, link=message.link) @@ -198,9 +198,9 @@ class WechatModule(_ModuleBase, _MessageBase): :return: 成功或失败 """ for conf in self._configs.values(): - if not self.checkMessage(message, conf.name): + if not self.check_message(message, conf.name): continue - client: WeChat = self.get_client(conf.name) + client: WeChat = self.get_instance(conf.name) if client: client.send_torrents_msg(title=message.title, torrents=torrents, userid=message.userid, link=message.link) @@ -210,5 +210,5 @@ class WechatModule(_ModuleBase, _MessageBase): 注册命令,实现这个函数接收系统可用的命令菜单 :param commands: 命令字典 """ - for client in self._clients.values(): + for client in self._instances.values(): client.create_menus(commands)