2 Commits

Author SHA1 Message Date
Koha9 6b14847598 Merge commit '0ede13717064aaee99c699d8a3720e9a9c478b1e' 2025-11-29 08:20:22 +09:00
Koha9 0ede137170 Support backend connection timeout configuration 2025-11-29 08:18:32 +09:00
4 changed files with 44 additions and 8 deletions
+1
View File
@@ -4,6 +4,7 @@
"server_url": "", "server_url": "",
"server_port": "32400", "server_port": "32400",
"server_scheme": "https", "server_scheme": "https",
"timeout": 9,
"library_name": "", "library_name": "",
"sync_mode": "merge_local_primary", "sync_mode": "merge_local_primary",
"local_path": "playlist", "local_path": "playlist",
+15 -1
View File
@@ -92,6 +92,7 @@ class SyncSettingsResponse(BaseModel):
server_url: str | None = None server_url: str | None = None
scheme: str | None = None scheme: str | None = None
port: str | None = None port: str | None = None
timeout: int | None = None
token: str | None = None token: str | None = None
@@ -135,6 +136,7 @@ def _get_cloud_playlists() -> tuple[list[dict], str, dict, str, list[str]]:
scheme=server_config.scheme, scheme=server_config.scheme,
url=server_config.url, url=server_config.url,
port=server_config.port, port=server_config.port,
timeout=server_config.timeout,
) )
status = "connected" if plex_client.connected else "failed" status = "connected" if plex_client.connected else "failed"
server_info.update( server_info.update(
@@ -245,6 +247,7 @@ def _get_server_status() -> tuple[dict, str, list[dict]]:
scheme=server_config.scheme, scheme=server_config.scheme,
url=server_config.url, url=server_config.url,
port=server_config.port, port=server_config.port,
timeout=server_config.timeout,
) )
connection_status = "connected" if plex_client.connected else "failed" connection_status = "connected" if plex_client.connected else "failed"
server_info.update( server_info.update(
@@ -301,6 +304,7 @@ async def get_settings():
server_url=server_config.url, server_url=server_config.url,
scheme=server_config.scheme, scheme=server_config.scheme,
port=server_config.port, port=server_config.port,
timeout=server_config.timeout,
token=server_config.token, token=server_config.token,
) )
@@ -345,6 +349,7 @@ async def api_connect(payload: ConnectRequest):
scheme=payload.protocol, scheme=payload.protocol,
url=payload.address, url=payload.address,
port=payload.port, port=payload.port,
timeout=payload.timeout,
) )
libraries = [] libraries = []
selected_library = payload.library_name or server_config.library_name selected_library = payload.library_name or server_config.library_name
@@ -359,6 +364,7 @@ async def api_connect(payload: ConnectRequest):
scheme=payload.protocol, scheme=payload.protocol,
url=payload.address, url=payload.address,
port=payload.port, port=payload.port,
timeout=payload.timeout,
library_name=selected_library or "", library_name=selected_library or "",
) )
server_info = { server_info = {
@@ -565,6 +571,7 @@ async def login_page(request: Request):
scheme=server_config.scheme, scheme=server_config.scheme,
url=server_config.url, url=server_config.url,
port=server_config.port, port=server_config.port,
timeout=server_config.timeout,
) )
music_libraries = plex_client.get_libs_name_list() music_libraries = plex_client.get_libs_name_list()
if music_libraries: if music_libraries:
@@ -612,6 +619,7 @@ async def login(
scheme=scheme, scheme=scheme,
url=url, url=url,
port=port, port=port,
timeout=server_config.timeout,
) )
# 成功连接后保存配置到配置文件 # 成功连接后保存配置到配置文件
music_libraries: list[str] = [] music_libraries: list[str] = []
@@ -632,12 +640,18 @@ async def login(
scheme=scheme, scheme=scheme,
url=url, url=url,
port=port, port=port,
timeout=server_config.timeout,
library_name=selected_library, library_name=selected_library,
) )
else: else:
music_libraries = [] music_libraries = []
server_config.set_and_save_config( server_config.set_and_save_config(
token=token_success, scheme=scheme, url=url, port=port, library_name="" token=token_success,
scheme=scheme,
url=url,
port=port,
timeout=server_config.timeout,
library_name="",
) )
return templates.TemplateResponse( return templates.TemplateResponse(
"login.html", "login.html",
+9
View File
@@ -17,6 +17,7 @@ class ServerConfig:
self.url = "" self.url = ""
self.scheme = "https" self.scheme = "https"
self.port = "32400" self.port = "32400"
self.timeout = 9
self.library_name = "" self.library_name = ""
self.sync_mode = DEFAULT_SYNC_MODE self.sync_mode = DEFAULT_SYNC_MODE
self.local_path = "playlist" self.local_path = "playlist"
@@ -43,6 +44,7 @@ class ServerConfig:
self.url = config.get("server_url", "") self.url = config.get("server_url", "")
self.scheme = config.get("server_scheme", "https") self.scheme = config.get("server_scheme", "https")
self.port = config.get("server_port", "32400") self.port = config.get("server_port", "32400")
self.timeout = config.get("timeout", 9)
self.library_name = config.get("library_name", "") self.library_name = config.get("library_name", "")
self.sync_mode = config.get("sync_mode", DEFAULT_SYNC_MODE) self.sync_mode = config.get("sync_mode", DEFAULT_SYNC_MODE)
self.local_path = config.get("local_path", "playlist") self.local_path = config.get("local_path", "playlist")
@@ -56,6 +58,7 @@ class ServerConfig:
"server_url": self.url, "server_url": self.url,
"server_scheme": self.scheme, "server_scheme": self.scheme,
"server_port": self.port, "server_port": self.port,
"timeout": self.timeout,
"library_name": self.library_name, "library_name": self.library_name,
"sync_mode": self.sync_mode, "sync_mode": self.sync_mode,
"local_path": self.local_path, "local_path": self.local_path,
@@ -74,6 +77,9 @@ class ServerConfig:
def set_port(self, port: str) -> None: def set_port(self, port: str) -> None:
self.port = port self.port = port
def set_timeout(self, timeout: int) -> None:
self.timeout = timeout if timeout and timeout > 0 else 9
def set_token(self, token: str) -> None: def set_token(self, token: str) -> None:
self.token = token self.token = token
@@ -103,6 +109,7 @@ class ServerConfig:
url: str = None, url: str = None,
scheme: str = None, scheme: str = None,
port: str = None, port: str = None,
timeout: int | None = None,
library_name: str | None = None, library_name: str | None = None,
sync_mode: str | None = None, sync_mode: str | None = None,
local_path: str | None = None, local_path: str | None = None,
@@ -118,6 +125,8 @@ class ServerConfig:
self.set_scheme(scheme) self.set_scheme(scheme)
if port is not None: if port is not None:
self.set_port(port) self.set_port(port)
if timeout is not None:
self.set_timeout(timeout)
if library_name is not None: if library_name is not None:
self.set_library(library_name) self.set_library(library_name)
if sync_mode is not None: if sync_mode is not None:
+19 -7
View File
@@ -50,6 +50,7 @@ class PlexClient:
scheme: str = "https", scheme: str = "https",
url: str = "", url: str = "",
port: str = "32400", port: str = "32400",
timeout: int | None = None,
) -> tuple[PlexServer, str]: ) -> tuple[PlexServer, str]:
"""Connect to the Plex server using username/password or token. """Connect to the Plex server using username/password or token.
@@ -69,11 +70,11 @@ class PlexClient:
try: try:
if not str_is_empty(token): if not str_is_empty(token):
self.server, self.token = self._connect_with_token( self.server, self.token = self._connect_with_token(
token, scheme, url, port token, scheme, url, port, timeout
) )
else: else:
self.server, self.token = self._connect_with_pw( self.server, self.token = self._connect_with_pw(
username, password, scheme, url, port username, password, scheme, url, port, timeout
) )
# Update the base URL and connection status # Update the base URL and connection status
self.base_url = build_plex_url(scheme, url, port) self.base_url = build_plex_url(scheme, url, port)
@@ -88,30 +89,41 @@ class PlexClient:
raise raise
def _connect_with_pw( def _connect_with_pw(
self, username: str, password: str, scheme: str, url: str, port: str = "32400" self,
username: str,
password: str,
scheme: str,
url: str,
port: str = "32400",
timeout: int | None = None,
): ):
"""Return a connected PlexServer instance and update config with token and server info.""" """Return a connected PlexServer instance and update config with token and server info."""
# url 初始化 # url 初始化
self.base_url = build_plex_url(scheme, url, port) self.base_url = build_plex_url(scheme, url, port)
# account 初始化 # account 初始化
account = MyPlexAccount(username, password) account = MyPlexAccount(username, password, timeout=timeout)
# token 获取 # token 获取
self.token = account.authenticationToken self.token = account.authenticationToken
self.server = PlexServer(self.base_url, self.token) self.server = PlexServer(self.base_url, self.token, timeout=timeout)
logger.debug( logger.debug(
f"Connected to Plex server with username: {username}, token: {self.token}" f"Connected to Plex server with username: {username}, token: {self.token}"
) )
return self.server, self.token return self.server, self.token
def _connect_with_token( def _connect_with_token(
self, token: str, scheme: str, url: str, port: str = "32400" self,
token: str,
scheme: str,
url: str,
port: str = "32400",
timeout: int | None = None,
): ):
"""Return a connected PlexServer instance using a token.""" """Return a connected PlexServer instance using a token."""
# URL 初始化 # URL 初始化
self.base_url = build_plex_url(scheme, url, port) self.base_url = build_plex_url(scheme, url, port)
self.server = PlexServer(self.base_url, token) self.server = PlexServer(self.base_url, token, timeout=timeout)
logger.debug(f"Connected to Plex server with token: {token}") logger.debug(f"Connected to Plex server with token: {token}")
return self.server, token return self.server, token