From 12c9f146b734d2e40d6f29a8bc4740f10c7d4a4c Mon Sep 17 00:00:00 2001 From: jxxghp Date: Tue, 20 Jun 2023 08:50:48 +0800 Subject: [PATCH] add emby/jellyfin userlogin --- app/chain/user.py | 15 +++++++++++++++ app/modules/emby/__init__.py | 10 +++++++++- app/modules/emby/emby.py | 27 +++++++++++++++++++++++++++ app/modules/jellyfin/__init__.py | 9 +++++++++ app/modules/jellyfin/jellyfin.py | 27 +++++++++++++++++++++++++++ 5 files changed, 87 insertions(+), 1 deletion(-) create mode 100644 app/chain/user.py diff --git a/app/chain/user.py b/app/chain/user.py new file mode 100644 index 00000000..1eb9a361 --- /dev/null +++ b/app/chain/user.py @@ -0,0 +1,15 @@ +from typing import Optional + +from app.chain import ChainBase + + +class UserChain(ChainBase): + + def user_authenticate(self, name, password) -> Optional[bool]: + """ + 辅助完成用户认证 + :param name: 用户名 + :param password: 密码 + :return: bool + """ + return self.run_module("user_authenticate", name=name, password=password) diff --git a/app/modules/emby/__init__.py b/app/modules/emby/__init__.py index 06fe2d42..3acc2d23 100644 --- a/app/modules/emby/__init__.py +++ b/app/modules/emby/__init__.py @@ -10,7 +10,6 @@ from app.schemas.types import MediaType class EmbyModule(_ModuleBase): - emby: Emby = None def init_module(self) -> None: @@ -22,6 +21,15 @@ class EmbyModule(_ModuleBase): def init_setting(self) -> Tuple[str, Union[str, bool]]: return "MEDIASERVER", "emby" + def user_authenticate(self, name, password) -> Optional[bool]: + """ + 使用Emby用户辅助完成用户认证 + :param name: 用户名 + :param password: 密码 + :return: bool + """ + return self.emby.authenticate(name, password) + def webhook_parser(self, body: Any, form: Any, args: Any) -> Optional[dict]: """ 解析Webhook报文体 diff --git a/app/modules/emby/emby.py b/app/modules/emby/emby.py index 852a73e4..3a4388d6 100644 --- a/app/modules/emby/emby.py +++ b/app/modules/emby/emby.py @@ -87,6 +87,33 @@ class Emby(metaclass=Singleton): logger.error(f"连接Users出错:" + str(e)) return None + def authenticate(self, username: str, password: str) -> Optional[bool]: + """ + 用户认证 + """ + if not self._host or not self._apikey: + return None + req_url = "%semby/Users/AuthenticateByName" % self._host + try: + res = RequestUtils(content_type="application/json").post_res( + url=req_url, + data=json.dumps({ + "Username": username, + "Pw": password, + "KeepMeLoggedIn": False + }) + ) + if res: + auth_token = res.json().get("AccessToken") + if auth_token: + logger.info(f"用户 {username} Emby认证成功") + return True + else: + logger.error(f"Users/AuthenticateByName 未获取到返回数据") + except Exception as e: + logger.error(f"连接Users/AuthenticateByName出错:" + str(e)) + return None + def get_server_id(self) -> Optional[str]: """ 获得服务器信息 diff --git a/app/modules/jellyfin/__init__.py b/app/modules/jellyfin/__init__.py index 97c51080..51d2de41 100644 --- a/app/modules/jellyfin/__init__.py +++ b/app/modules/jellyfin/__init__.py @@ -22,6 +22,15 @@ class JellyfinModule(_ModuleBase): def init_setting(self) -> Tuple[str, Union[str, bool]]: return "MEDIASERVER", "jellyfin" + def user_authenticate(self, name, password) -> Optional[bool]: + """ + 使用Emby用户辅助完成用户认证 + :param name: 用户名 + :param password: 密码 + :return: bool + """ + return self.jellyfin.authenticate(name, password) + def webhook_parser(self, body: Any, form: Any, args: Any) -> Optional[dict]: """ 解析Webhook报文体 diff --git a/app/modules/jellyfin/jellyfin.py b/app/modules/jellyfin/jellyfin.py index c1d67475..27202e2b 100644 --- a/app/modules/jellyfin/jellyfin.py +++ b/app/modules/jellyfin/jellyfin.py @@ -1,3 +1,4 @@ +import json import re from typing import List, Union, Optional, Dict @@ -83,6 +84,32 @@ class Jellyfin(metaclass=Singleton): logger.error(f"连接Users出错:" + str(e)) return None + def authenticate(self, username: str, password: str) -> Optional[bool]: + """ + 用户认证 + """ + if not self._host or not self._apikey: + return None + req_url = "%sUsers/authenticatebyname" % self._host + try: + res = RequestUtils(content_type="application/json").post_res( + url=req_url, + data=json.dumps({ + "Username": username, + "Pw": password + }) + ) + if res: + auth_token = res.json().get("AccessToken") + if auth_token: + logger.info(f"用户 {username} Jellyfin认证成功") + return True + else: + logger.error(f"Users/AuthenticateByName 未获取到返回数据") + except Exception as e: + logger.error(f"连接Users/AuthenticateByName出错:" + str(e)) + return None + def get_server_id(self) -> Optional[str]: """ 获得服务器信息