Merge pull request #2780 from InfinityPacer/feature/module

This commit is contained in:
jxxghp
2024-09-27 10:19:28 +08:00
committed by GitHub
19 changed files with 378 additions and 384 deletions

View File

@@ -1,8 +1,7 @@
from typing import Optional, Tuple, Union, Any, List, Generator, Dict
from typing import Optional, Tuple, Union, Any, List, Generator
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, _MediaServerBase
from app.modules.plex.plex import Plex
@@ -10,22 +9,14 @@ from app.schemas import MediaServerConf
from app.schemas.types import MediaType
class PlexModule(_ModuleBase, _MediaServerBase):
class PlexModule(_ModuleBase, _MediaServerBase[Plex]):
def init_module(self) -> None:
"""
初始化模块
"""
# 读取媒体服务器配置
self._servers: Dict[str, Plex] = {}
self._configs: Dict[str, MediaServerConf] = {}
mediaservers = MediaServerHelper().get_mediaservers()
if not mediaservers:
return
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)
super().init_service(service_name=Plex.__name__.lower(),
service_type=lambda conf: Plex(**conf.config, sync_libraries=conf.sync_libraries))
@staticmethod
def get_name() -> str:
@@ -38,9 +29,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 +46,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 +64,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 +72,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 +86,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 +135,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,16 +154,17 @@ 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
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: 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 +173,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 +183,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 +198,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 +207,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 +216,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)