From 589a1765ed4c9ffb9512d1b42dd5443ee90002c1 Mon Sep 17 00:00:00 2001 From: InfinityPacer <160988576+InfinityPacer@users.noreply.github.com> Date: Sat, 30 Nov 2024 01:04:48 +0800 Subject: [PATCH 1/2] feat(auth): support specifying service for authentication --- app/modules/emby/__init__.py | 14 ++++++++++++-- app/modules/jellyfin/__init__.py | 14 ++++++++++++-- app/modules/plex/__init__.py | 14 ++++++++++++-- 3 files changed, 36 insertions(+), 6 deletions(-) diff --git a/app/modules/emby/__init__.py b/app/modules/emby/__init__.py index d417de92..0956dbd9 100644 --- a/app/modules/emby/__init__.py +++ b/app/modules/emby/__init__.py @@ -66,16 +66,26 @@ class EmbyModule(_ModuleBase, _MediaServerBase[Emby]): logger.info(f"Emby服务器 {name} 连接断开,尝试重连 ...") server.reconnect() - def user_authenticate(self, credentials: AuthCredentials) -> Optional[AuthCredentials]: + def user_authenticate(self, credentials: AuthCredentials, service_name: Optional[str] = None) \ + -> Optional[AuthCredentials]: """ 使用Emby用户辅助完成用户认证 :param credentials: 认证数据 + :param service_name: 指定要认证的媒体服务器名称,若为 None 则认证所有服务 :return: 认证数据 """ # Emby认证 if not credentials or credentials.grant_type != "password": return None - for name, server in self.get_instances().items(): + # 确定要认证的服务器列表 + if service_name: + # 如果指定了服务名,获取该服务实例 + servers = [(service_name, self.get_instance(service_name))] + else: + # 如果没有指定服务名,遍历所有服务 + servers = self.get_instances().items() + # 遍历要认证的服务器 + for name, server in servers: # 触发认证拦截事件 intercept_event = eventmanager.send_event( etype=ChainEventType.AuthIntercept, diff --git a/app/modules/jellyfin/__init__.py b/app/modules/jellyfin/__init__.py index 15c03c7c..60ee4df7 100644 --- a/app/modules/jellyfin/__init__.py +++ b/app/modules/jellyfin/__init__.py @@ -66,16 +66,26 @@ class JellyfinModule(_ModuleBase, _MediaServerBase[Jellyfin]): return False, f"无法连接Jellyfin服务器:{name}" return True, "" - def user_authenticate(self, credentials: AuthCredentials) -> Optional[AuthCredentials]: + def user_authenticate(self, credentials: AuthCredentials, service_name: Optional[str] = None) \ + -> Optional[AuthCredentials]: """ 使用Jellyfin用户辅助完成用户认证 :param credentials: 认证数据 + :param service_name: 指定要认证的媒体服务器名称,若为 None 则认证所有服务 :return: 认证数据 """ # Jellyfin认证 if not credentials or credentials.grant_type != "password": return None - for name, server in self.get_instances().items(): + # 确定要认证的服务器列表 + if service_name: + # 如果指定了服务名,获取该服务实例 + servers = [(service_name, self.get_instance(service_name))] + else: + # 如果没有指定服务名,遍历所有服务 + servers = self.get_instances().items() + # 遍历要认证的服务器 + for name, server in servers: # 触发认证拦截事件 intercept_event = eventmanager.send_event( etype=ChainEventType.AuthIntercept, diff --git a/app/modules/plex/__init__.py b/app/modules/plex/__init__.py index 0dfbbcac..b3852bbf 100644 --- a/app/modules/plex/__init__.py +++ b/app/modules/plex/__init__.py @@ -66,16 +66,26 @@ class PlexModule(_ModuleBase, _MediaServerBase[Plex]): logger.info(f"Plex {name} 服务器连接断开,尝试重连 ...") server.reconnect() - def user_authenticate(self, credentials: AuthCredentials) -> Optional[AuthCredentials]: + def user_authenticate(self, credentials: AuthCredentials, service_name: Optional[str] = None) \ + -> Optional[AuthCredentials]: """ 使用Plex用户辅助完成用户认证 :param credentials: 认证数据 + :param service_name: 指定要认证的媒体服务器名称,若为 None 则认证所有服务 :return: 认证数据 """ # Plex认证 if not credentials or credentials.grant_type != "password": return None - for name, server in self.get_instances().items(): + # 确定要认证的服务器列表 + if service_name: + # 如果指定了服务名,获取该服务实例 + servers = [(service_name, self.get_instance(service_name))] + else: + # 如果没有指定服务名,遍历所有服务 + servers = self.get_instances().items() + # 遍历要认证的服务器 + for name, server in servers: # 触发认证拦截事件 intercept_event = eventmanager.send_event( etype=ChainEventType.AuthIntercept, From ef20508840456af4f99d02dbfad448df68f7145d Mon Sep 17 00:00:00 2001 From: InfinityPacer <160988576+InfinityPacer@users.noreply.github.com> Date: Sat, 30 Nov 2024 01:14:36 +0800 Subject: [PATCH 2/2] feat(auth): handle service instance retrieval with proper null check --- app/modules/emby/__init__.py | 2 +- app/modules/jellyfin/__init__.py | 2 +- app/modules/plex/__init__.py | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/app/modules/emby/__init__.py b/app/modules/emby/__init__.py index 0956dbd9..8b3680ad 100644 --- a/app/modules/emby/__init__.py +++ b/app/modules/emby/__init__.py @@ -80,7 +80,7 @@ class EmbyModule(_ModuleBase, _MediaServerBase[Emby]): # 确定要认证的服务器列表 if service_name: # 如果指定了服务名,获取该服务实例 - servers = [(service_name, self.get_instance(service_name))] + servers = [(service_name, server)] if (server := self.get_instance(service_name)) else [] else: # 如果没有指定服务名,遍历所有服务 servers = self.get_instances().items() diff --git a/app/modules/jellyfin/__init__.py b/app/modules/jellyfin/__init__.py index 60ee4df7..9340a6ea 100644 --- a/app/modules/jellyfin/__init__.py +++ b/app/modules/jellyfin/__init__.py @@ -80,7 +80,7 @@ class JellyfinModule(_ModuleBase, _MediaServerBase[Jellyfin]): # 确定要认证的服务器列表 if service_name: # 如果指定了服务名,获取该服务实例 - servers = [(service_name, self.get_instance(service_name))] + servers = [(service_name, server)] if (server := self.get_instance(service_name)) else [] else: # 如果没有指定服务名,遍历所有服务 servers = self.get_instances().items() diff --git a/app/modules/plex/__init__.py b/app/modules/plex/__init__.py index b3852bbf..8381b241 100644 --- a/app/modules/plex/__init__.py +++ b/app/modules/plex/__init__.py @@ -80,7 +80,7 @@ class PlexModule(_ModuleBase, _MediaServerBase[Plex]): # 确定要认证的服务器列表 if service_name: # 如果指定了服务名,获取该服务实例 - servers = [(service_name, self.get_instance(service_name))] + servers = [(service_name, server)] if (server := self.get_instance(service_name)) else [] else: # 如果没有指定服务名,遍历所有服务 servers = self.get_instances().items()