diff --git a/app/modules/__init__.py b/app/modules/__init__.py index 38172523..db4feacf 100644 --- a/app/modules/__init__.py +++ b/app/modules/__init__.py @@ -92,3 +92,35 @@ class _MessageBase: if message.mtype.value not in switchs: return False return True + + +class _DownloaderBase: + """ + 下载器基类 + """ + + _servers: Dict[str, Any] = {} + _default_server: Any = None + _default_server_name: str = None + + def get_server(self, name: str = None) -> Optional[Any]: + """ + 获取服务器,name为空则返回默认服务器 + """ + if name: + return self._servers.get(name) + return self._default_server + + +class _MediaServerBase: + """ + 媒体服务器基类 + """ + + _servers: Dict[str, Any] = {} + + def get_server(self, name: str) -> Optional[Any]: + """ + 获取Plex服务器 + """ + return self._servers.get(name) diff --git a/app/modules/emby/__init__.py b/app/modules/emby/__init__.py index 1dd55879..f73189b4 100644 --- a/app/modules/emby/__init__.py +++ b/app/modules/emby/__init__.py @@ -4,20 +4,19 @@ from app import schemas from app.core.context import MediaInfo from app.helper.mediaserver import MediaServerHelper from app.log import logger -from app.modules import _ModuleBase +from app.modules import _ModuleBase, _MediaServerBase from app.modules.emby.emby import Emby from app.schemas.types import MediaType -class EmbyModule(_ModuleBase): - _servers: Dict[str, Emby] = {} +class EmbyModule(_ModuleBase, _MediaServerBase): def init_module(self) -> None: """ 初始化模块 """ # 读取媒体服务器配置 - self._servers = {} + self._servers: Dict[str, Emby] = {} mediaservers = MediaServerHelper().get_mediaservers() if not mediaservers: return @@ -25,12 +24,6 @@ class EmbyModule(_ModuleBase): if server.type == "emby" and server.enabled: self._servers[server.name] = Emby(**server.config) - def get_server(self, name: str) -> Optional[Emby]: - """ - 获取Emby服务器 - """ - return self._servers.get(name) - @staticmethod def get_name() -> str: return "Emby" @@ -88,7 +81,7 @@ class EmbyModule(_ModuleBase): """ source = args.get("source") if source: - server = self.get_server(source) + server: Emby = self.get_server(source) if not server: return None return server.get_webhook_message(form, args) @@ -152,10 +145,10 @@ class EmbyModule(_ModuleBase): 媒体数量统计 """ if server: - server_obj = self.get_server(server) - if not server_obj: + server: Emby = self.get_server(server) + if not server: return None - servers = [server_obj] + servers = [server] else: servers = self._servers.values() media_statistics = [] @@ -172,27 +165,27 @@ class EmbyModule(_ModuleBase): """ 媒体库列表 """ - server_obj = self.get_server(server) - if server_obj: - return server_obj.get_librarys(username) + server: Emby = self.get_server(server) + if server: + return server.get_librarys(username) return None def mediaserver_items(self, server: str, library_id: str) -> Optional[Generator]: """ 媒体库项目列表 """ - server_obj = self.get_server(server) - if server_obj: - return server_obj.get_items(library_id) + server: Emby = self.get_server(server) + if server: + return server.get_items(library_id) return None def mediaserver_iteminfo(self, server: str, item_id: str) -> Optional[schemas.MediaServerItem]: """ 媒体库项目详情 """ - server_obj = self.get_server(server) - if server_obj: - return server_obj.get_iteminfo(item_id) + server: Emby = self.get_server(server) + if server: + return server.get_iteminfo(item_id) return None def mediaserver_tv_episodes(self, server: str, @@ -200,10 +193,10 @@ class EmbyModule(_ModuleBase): """ 获取剧集信息 """ - server_obj = self.get_server(server) - if not server_obj: + server: Emby = self.get_server(server) + if not server: return None - _, seasoninfo = server_obj.get_tv_episodes(item_id=item_id) + _, seasoninfo = server.get_tv_episodes(item_id=item_id) if not seasoninfo: return [] return [schemas.MediaServerSeasonInfo( @@ -216,26 +209,26 @@ class EmbyModule(_ModuleBase): """ 获取媒体服务器正在播放信息 """ - server_obj = self.get_server(server) - if not server_obj: + server: Emby = self.get_server(server) + if not server: return [] - return server_obj.get_resume(num=count, username=username) + return server.get_resume(num=count, username=username) def mediaserver_play_url(self, server: str, item_id: Union[str, int]) -> Optional[str]: """ 获取媒体库播放地址 """ - server_obj = self.get_server(server) - if not server_obj: + server: Emby = self.get_server(server) + if not server: return None - return server_obj.get_play_url(item_id) + return server.get_play_url(item_id) def mediaserver_latest(self, server: str, count: int = 20, username: str = None) -> List[schemas.MediaServerPlayItem]: """ 获取媒体服务器最新入库条目 """ - server_obj = self.get_server(server) - if not server_obj: + server: Emby = self.get_server(server) + if not server: return [] - return server_obj.get_latest(num=count, username=username) + return server.get_latest(num=count, username=username) diff --git a/app/modules/jellyfin/__init__.py b/app/modules/jellyfin/__init__.py index dd09b279..02c5f870 100644 --- a/app/modules/jellyfin/__init__.py +++ b/app/modules/jellyfin/__init__.py @@ -4,20 +4,19 @@ from app import schemas from app.core.context import MediaInfo from app.helper.mediaserver import MediaServerHelper from app.log import logger -from app.modules import _ModuleBase +from app.modules import _ModuleBase, _MediaServerBase from app.modules.jellyfin.jellyfin import Jellyfin from app.schemas.types import MediaType -class JellyfinModule(_ModuleBase): - _servers: Dict[str, Jellyfin] = {} +class JellyfinModule(_ModuleBase, _MediaServerBase): def init_module(self) -> None: """ 初始化模块 """ # 读取媒体服务器配置 - self._servers = {} + self._servers: Dict[str, Jellyfin] = {} mediaservers = MediaServerHelper().get_mediaservers() if not mediaservers: return @@ -25,12 +24,6 @@ class JellyfinModule(_ModuleBase): if server.type == "jellyfin" and server.enabled: self._servers[server.name] = Jellyfin(**server.config) - def get_server(self, name: str) -> Optional[Jellyfin]: - """ - 获取Jellyfin服务器 - """ - return self._servers.get(name) - @staticmethod def get_name() -> str: return "Jellyfin" @@ -88,7 +81,7 @@ class JellyfinModule(_ModuleBase): """ source = args.get("source") if source: - server = self.get_server(source) + server: Jellyfin = self.get_server(source) if not server: return None return server.get_webhook_message(body) @@ -150,10 +143,10 @@ class JellyfinModule(_ModuleBase): 媒体数量统计 """ if server: - server_obj = self.get_server(server) - if not server_obj: + server: Jellyfin = self.get_server(server) + if not server: return None - servers = [server_obj] + servers = [server] else: servers = self._servers.values() media_statistics = [] @@ -170,27 +163,27 @@ class JellyfinModule(_ModuleBase): """ 媒体库列表 """ - server_obj = self.get_server(server) - if server_obj: - return server_obj.get_librarys(username) + server: Jellyfin = self.get_server(server) + if server: + return server.get_librarys(username) return None def mediaserver_items(self, server: str, library_id: str) -> Optional[Generator]: """ 媒体库项目列表 """ - server_obj = self.get_server(server) - if server_obj: - return server_obj.get_items(library_id) + server: Jellyfin = self.get_server(server) + if server: + return server.get_items(library_id) return None def mediaserver_iteminfo(self, server: str, item_id: str) -> Optional[schemas.MediaServerItem]: """ 媒体库项目详情 """ - server_obj = self.get_server(server) - if server_obj: - return server_obj.get_iteminfo(item_id) + server: Jellyfin = self.get_server(server) + if server: + return server.get_iteminfo(item_id) return None def mediaserver_tv_episodes(self, server: str, @@ -198,10 +191,10 @@ class JellyfinModule(_ModuleBase): """ 获取剧集信息 """ - server_obj = self.get_server(server) - if not server_obj: + server: Jellyfin = self.get_server(server) + if not server: return None - _, seasoninfo = server_obj.get_tv_episodes(item_id=item_id) + _, seasoninfo = server.get_tv_episodes(item_id=item_id) if not seasoninfo: return [] return [schemas.MediaServerSeasonInfo( @@ -214,26 +207,26 @@ class JellyfinModule(_ModuleBase): """ 获取媒体服务器正在播放信息 """ - server_obj = self.get_server(server) - if not server_obj: + server: Jellyfin = self.get_server(server) + if not server: return [] - return server_obj.get_resume(num=count, username=username) + return server.get_resume(num=count, username=username) def mediaserver_play_url(self, server: str, item_id: Union[str, int]) -> Optional[str]: """ 获取媒体库播放地址 """ - server_obj = self.get_server(server) - if not server_obj: + server: Jellyfin = self.get_server(server) + if not server: return None - return server_obj.get_play_url(item_id) + return server.get_play_url(item_id) def mediaserver_latest(self, server: str, count: int = 20, username: str = None) -> List[schemas.MediaServerPlayItem]: """ 获取媒体服务器最新入库条目 """ - server_obj = self.get_server(server) - if not server_obj: + server: Jellyfin = self.get_server(server) + if not server: return [] - return server_obj.get_latest(num=count, username=username) + return server.get_latest(num=count, username=username) diff --git a/app/modules/plex/__init__.py b/app/modules/plex/__init__.py index b3f3f593..2b845bf8 100644 --- a/app/modules/plex/__init__.py +++ b/app/modules/plex/__init__.py @@ -4,20 +4,19 @@ from app import schemas from app.core.context import MediaInfo from app.helper.mediaserver import MediaServerHelper from app.log import logger -from app.modules import _ModuleBase +from app.modules import _ModuleBase, _MediaServerBase from app.modules.plex.plex import Plex from app.schemas.types import MediaType -class PlexModule(_ModuleBase): - _servers: Dict[str, Plex] = {} +class PlexModule(_ModuleBase, _MediaServerBase): def init_module(self) -> None: """ 初始化模块 """ # 读取媒体服务器配置 - self._servers = {} + self._servers: Dict[str, Plex] = {} mediaservers = MediaServerHelper().get_mediaservers() if not mediaservers: return @@ -29,12 +28,6 @@ class PlexModule(_ModuleBase): def get_name() -> str: return "Plex" - def get_server(self, name: str) -> Optional[Plex]: - """ - 获取Plex服务器 - """ - return self._servers.get(name) - def stop(self): pass @@ -74,7 +67,7 @@ class PlexModule(_ModuleBase): """ source = args.get("source") if source: - server = self.get_server(source) + server: Plex = self.get_server(source) if not server: return None return server.get_webhook_message(body) @@ -140,10 +133,10 @@ class PlexModule(_ModuleBase): 媒体数量统计 """ if server: - server_obj = self.get_server(server) - if not server_obj: + server: Plex = self.get_server(server) + if not server: return None - servers = [server_obj] + servers = [server] else: servers = self._servers.values() media_statistics = [] @@ -158,27 +151,27 @@ class PlexModule(_ModuleBase): """ 媒体库列表 """ - server_obj = self.get_server(server) - if server_obj: - return server_obj.get_librarys() + server: Plex = self.get_server(server) + if server: + return server.get_librarys() return None def mediaserver_items(self, server: str, library_id: str) -> Optional[Generator]: """ 媒体库项目列表 """ - server_obj = self.get_server(server) - if server_obj: - return server_obj.get_items(library_id) + server: Plex = self.get_server(server) + if server: + return server.get_items(library_id) return None def mediaserver_iteminfo(self, server: str, item_id: str) -> Optional[schemas.MediaServerItem]: """ 媒体库项目详情 """ - server_obj = self.get_server(server) - if server_obj: - return server_obj.get_iteminfo(item_id) + server: Plex = self.get_server(server) + if server: + return server.get_iteminfo(item_id) return None def mediaserver_tv_episodes(self, server: str, @@ -186,10 +179,10 @@ class PlexModule(_ModuleBase): """ 获取剧集信息 """ - server_obj = self.get_server(server) - if not server_obj: + server: Plex = self.get_server(server) + if not server: return None - _, seasoninfo = server_obj.get_tv_episodes(item_id=item_id) + _, seasoninfo = server.get_tv_episodes(item_id=item_id) if not seasoninfo: return [] return [schemas.MediaServerSeasonInfo( @@ -201,25 +194,25 @@ class PlexModule(_ModuleBase): """ 获取媒体服务器正在播放信息 """ - server_obj = self.get_server(server) - if not server_obj: + server: Plex = self.get_server(server) + if not server: return [] - return server_obj.get_resume(num=count) + return server.get_resume(num=count) def mediaserver_latest(self, server: str, count: int = 20, **kwargs) -> List[schemas.MediaServerPlayItem]: """ 获取媒体服务器最新入库条目 """ - server_obj = self.get_server(server) - if not server_obj: + server: Plex = self.get_server(server) + if not server: return [] - return server_obj.get_latest(num=count) + return server.get_latest(num=count) def mediaserver_play_url(self, server: str, item_id: Union[str, int]) -> Optional[str]: """ 获取媒体库播放地址 """ - server_obj = self.get_server(server) - if not server_obj: + server: Plex = self.get_server(server) + if not server: return None - return server_obj.get_play_url(item_id) + return server.get_play_url(item_id) diff --git a/app/modules/qbittorrent/__init__.py b/app/modules/qbittorrent/__init__.py index c50e84b3..62445332 100644 --- a/app/modules/qbittorrent/__init__.py +++ b/app/modules/qbittorrent/__init__.py @@ -10,7 +10,7 @@ from app.core.config import settings from app.core.metainfo import MetaInfo from app.helper.downloader import DownloaderHelper from app.log import logger -from app.modules import _ModuleBase +from app.modules import _ModuleBase, _DownloaderBase from app.modules.qbittorrent.qbittorrent import Qbittorrent from app.schemas import TransferTorrent, DownloadingTorrent from app.schemas.types import TorrentStatus @@ -18,17 +18,14 @@ from app.utils.string import StringUtils from app.utils.system import SystemUtils -class QbittorrentModule(_ModuleBase): - _servers: Dict[str, Qbittorrent] = {} - _default_server: Qbittorrent = None - _default_server_name: str = None +class QbittorrentModule(_ModuleBase, _DownloaderBase): def init_module(self) -> None: """ 初始化模块 """ # 读取下载器配置 - self._servers = {} + self._servers: Dict[str, Qbittorrent] = {} downloaders = DownloaderHelper().get_downloaders() if not downloaders: return @@ -43,14 +40,6 @@ class QbittorrentModule(_ModuleBase): def get_name() -> str: return "Qbittorrent" - def get_server(self, name: str = None) -> Optional[Qbittorrent]: - """ - 获取服务器,name为空则返回默认服务器 - """ - if name: - return self._servers.get(name) - return self._default_server - def stop(self): pass @@ -112,7 +101,7 @@ class QbittorrentModule(_ModuleBase): return None, None, f"种子文件不存在:{content}" # 获取下载器 - server = self.get_server(downloader) + server: Qbittorrent = self.get_server(downloader) if not server: return None @@ -210,7 +199,7 @@ class QbittorrentModule(_ModuleBase): :return: 下载器中符合状态的种子列表 """ # 获取下载器 - server = self.get_server(downloader) + server: Qbittorrent = self.get_server(downloader) if not server: return None @@ -282,7 +271,7 @@ class QbittorrentModule(_ModuleBase): :param path: 源目录 :param downloader: 下载器 """ - server = self.get_server(downloader) + server: Qbittorrent = self.get_server(downloader) if not server: return None server.set_torrents_tag(ids=hashs, tags=['已整理']) @@ -306,7 +295,7 @@ class QbittorrentModule(_ModuleBase): :param downloader: 下载器 :return: bool """ - server = self.get_server(downloader) + server: Qbittorrent = self.get_server(downloader) if not server: return None return server.delete_torrents(delete_file=delete_file, ids=hashs) @@ -319,7 +308,7 @@ class QbittorrentModule(_ModuleBase): :param downloader: 下载器 :return: bool """ - server = self.get_server(downloader) + server: Qbittorrent = self.get_server(downloader) if not server: return None return server.start_torrents(ids=hashs) @@ -331,7 +320,7 @@ class QbittorrentModule(_ModuleBase): :param downloader: 下载器 :return: bool """ - server = self.get_server(downloader) + server: Qbittorrent = self.get_server(downloader) if not server: return None return server.stop_torrents(ids=hashs) @@ -340,7 +329,7 @@ class QbittorrentModule(_ModuleBase): """ 获取种子文件列表 """ - server = self.get_server(downloader) + server: Qbittorrent = self.get_server(downloader) if not server: return None return server.get_files(tid=tid) @@ -350,7 +339,7 @@ class QbittorrentModule(_ModuleBase): 下载器信息 """ if downloader: - server = self.get_server(downloader) + server: Qbittorrent = self.get_server(downloader) if not server: return None servers = [server] diff --git a/app/modules/transmission/__init__.py b/app/modules/transmission/__init__.py index ccb57555..ad579fe8 100644 --- a/app/modules/transmission/__init__.py +++ b/app/modules/transmission/__init__.py @@ -10,7 +10,7 @@ from app.core.config import settings from app.core.metainfo import MetaInfo from app.helper.downloader import DownloaderHelper from app.log import logger -from app.modules import _ModuleBase +from app.modules import _ModuleBase, _DownloaderBase from app.modules.transmission.transmission import Transmission from app.schemas import TransferTorrent, DownloadingTorrent from app.schemas.types import TorrentStatus @@ -18,14 +18,11 @@ from app.utils.string import StringUtils from app.utils.system import SystemUtils -class TransmissionModule(_ModuleBase): - _servers: Dict[str, Transmission] = {} - _default_server: Transmission = None - _default_server_name: str = None +class TransmissionModule(_ModuleBase, _DownloaderBase): def init_module(self) -> None: # 读取下载器配置 - self._servers = {} + self._servers: Dict[str, Transmission] = {} downloaders = DownloaderHelper().get_downloaders() if not downloaders: return @@ -39,14 +36,6 @@ class TransmissionModule(_ModuleBase): @staticmethod def get_name() -> str: return "Transmission" - - def get_server(self, name: str = None) -> Optional[Transmission]: - """ - 获取服务器,name为空则返回默认服务器 - """ - if name: - return self._servers.get(name) - return self._default_server def stop(self): pass @@ -111,7 +100,7 @@ class TransmissionModule(_ModuleBase): return None, None, f"种子文件不存在:{content}" # 获取下载器 - server = self.get_server(downloader) + server: Transmission = self.get_server(downloader) if not server: return None @@ -202,7 +191,7 @@ class TransmissionModule(_ModuleBase): :return: 下载器中符合状态的种子列表 """ # 获取下载器 - server = self.get_server(downloader) + server: Transmission = self.get_server(downloader) if not server: return None ret_torrents = [] @@ -270,7 +259,7 @@ class TransmissionModule(_ModuleBase): :return: None """ # 获取下载器 - server = self.get_server(downloader) + server: Transmission = self.get_server(downloader) if not server: return None # 获取原标签 @@ -302,7 +291,7 @@ class TransmissionModule(_ModuleBase): :return: bool """ # 获取下载器 - server = self.get_server(downloader) + server: Transmission = self.get_server(downloader) if not server: return None return server.delete_torrents(delete_file=delete_file, ids=hashs) @@ -316,7 +305,7 @@ class TransmissionModule(_ModuleBase): :return: bool """ # 获取下载器 - server = self.get_server(downloader) + server: Transmission = self.get_server(downloader) if not server: return None return server.start_torrents(ids=hashs) @@ -330,7 +319,7 @@ class TransmissionModule(_ModuleBase): :return: bool """ # 获取下载器 - server = self.get_server(downloader) + server: Transmission = self.get_server(downloader) if not server: return None return server.start_torrents(ids=hashs) @@ -340,7 +329,7 @@ class TransmissionModule(_ModuleBase): 获取种子文件列表 """ # 获取下载器 - server = self.get_server(downloader) + server: Transmission = self.get_server(downloader) if not server: return None return server.get_files(tid=tid) @@ -350,7 +339,7 @@ class TransmissionModule(_ModuleBase): 下载器信息 """ if downloader: - server = self.get_server(downloader) + server: Transmission = self.get_server(downloader) if not server: return None servers = [server]