refactor (module): improve the implementation of base classes

This commit is contained in:
InfinityPacer
2024-09-26 19:44:35 +08:00
parent ddfcdf9ce2
commit 5efcd6e6be
12 changed files with 186 additions and 194 deletions

View File

@@ -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

View File

@@ -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)

View File

@@ -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)

View File

@@ -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)

View File

@@ -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:

View File

@@ -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)

View File

@@ -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)

View File

@@ -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)

View File

@@ -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:

View File

@@ -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)

View File

@@ -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:

View File

@@ -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)