From c46803f6ac258c26bf9736cb2a7accca06f7858d Mon Sep 17 00:00:00 2001 From: Erik Nilsson Date: Fri, 8 Mar 2024 12:44:21 +0100 Subject: [PATCH] Add option to connect to plex server over https --- .../server/providers/plex/__init__.py | 34 +++++++++++++++++-- .../server/providers/plex/helpers.py | 8 +++-- 2 files changed, 37 insertions(+), 5 deletions(-) diff --git a/music_assistant/server/providers/plex/__init__.py b/music_assistant/server/providers/plex/__init__.py index 8d714db05..18e800594 100644 --- a/music_assistant/server/providers/plex/__init__.py +++ b/music_assistant/server/providers/plex/__init__.py @@ -4,6 +4,7 @@ import asyncio import logging +import requests from asyncio import TaskGroup from typing import TYPE_CHECKING, Any @@ -69,6 +70,8 @@ CONF_LIBRARY_ID = "library_id" CONF_LOCAL_SERVER_IP = "local_server_ip" CONF_LOCAL_SERVER_PORT = "local_server_port" +CONF_LOCAL_SERVER_SSL = "local_server_ssl" +CONF_LOCAL_SERVER_VERIFY_CERT = "local_server_verify_cert" CONF_USE_GDM = "use_gdm" CONF_ACTION_GDM = "gdm" FAKE_ARTIST_PREFIX = "_fake://" @@ -113,9 +116,13 @@ async def get_config_entries( if server_details[0] is None and server_details[1] is None: values[CONF_LOCAL_SERVER_IP] = "Discovery failed, please add IP manually" values[CONF_LOCAL_SERVER_PORT] = "Discovery failed, please add Port manually" + values[CONF_LOCAL_SERVER_SSL] = "Discovery failed, please set SSL manually" + values[CONF_LOCAL_SERVER_VERIFY_CERT] = "Discovery failed, please set Verify certificate manually" else: values[CONF_LOCAL_SERVER_IP] = server_details[0] values[CONF_LOCAL_SERVER_PORT] = server_details[1] + values[CONF_LOCAL_SERVER_SSL] = False + values[CONF_LOCAL_SERVER_VERIFY_CERT] = False # config flow auth action/step (authenticate button clicked) if action == CONF_ACTION_AUTH: async with AuthenticationHelper(mass, values["session_id"]) as auth_helper: @@ -145,7 +152,9 @@ async def get_config_entries( token = mass.config.decrypt_string(values.get(CONF_AUTH_TOKEN)) server_http_ip = values.get(CONF_LOCAL_SERVER_IP) server_http_port = values.get(CONF_LOCAL_SERVER_PORT) - if not (libraries := await get_libraries(mass, token, server_http_ip, server_http_port)): + server_http_ssl = values.get(CONF_LOCAL_SERVER_SSL) + server_http_verify_cert = values.get(CONF_LOCAL_SERVER_VERIFY_CERT) + if not (libraries := await get_libraries(mass, token, server_http_ssl, server_http_ip, server_http_port, server_http_verify_cert)): msg = "Unable to retrieve Servers and/or Music Libraries" raise LoginFailed(msg) conf_libraries.options = tuple( @@ -179,6 +188,22 @@ async def get_config_entries( required=True, value=values.get(CONF_LOCAL_SERVER_PORT) if values else None, ), + ConfigEntry( + key=CONF_LOCAL_SERVER_SSL, + type=ConfigEntryType.BOOLEAN, + label="SSL (HTTPS)", + description="Connect to the local server using SSL (HTTPS)", + required=True, + value=values.get(CONF_LOCAL_SERVER_SSL) if values else None, + ), + ConfigEntry( + key=CONF_LOCAL_SERVER_VERIFY_CERT, + type=ConfigEntryType.BOOLEAN, + label="Verify certificate", + description="Verify local server SSL certificate", + required=True, + value=values.get(CONF_LOCAL_SERVER_VERIFY_CERT) if values else None, + ), ConfigEntry( key=CONF_AUTH_TOKEN, type=ConfigEntryType.SECURE_STRING, @@ -208,9 +233,12 @@ async def handle_async_init(self) -> None: def connect() -> PlexServer: try: + session = requests.Session() + session.verify = self.config.get_value(CONF_LOCAL_SERVER_VERIFY_CERT) if self.config.get_value(CONF_LOCAL_SERVER_SSL) else False + local_server_protocol = "https" if self.config.get_value(CONF_LOCAL_SERVER_SSL) else "http" plex_server = PlexServer( - f"http://{self.config.get_value(CONF_LOCAL_SERVER_IP)}:{self.config.get_value(CONF_LOCAL_SERVER_PORT)}", - token=self.config.get_value(CONF_AUTH_TOKEN), + f"{local_server_protocol}://{self.config.get_value(CONF_LOCAL_SERVER_IP)}:{self.config.get_value(CONF_LOCAL_SERVER_PORT)}", + token=self.config.get_value(CONF_AUTH_TOKEN), session=session, ) except plexapi.exceptions.BadRequest as err: if "Invalid token" in str(err): diff --git a/music_assistant/server/providers/plex/helpers.py b/music_assistant/server/providers/plex/helpers.py index 21e3d4e09..937c84f42 100644 --- a/music_assistant/server/providers/plex/helpers.py +++ b/music_assistant/server/providers/plex/helpers.py @@ -3,6 +3,7 @@ from __future__ import annotations import asyncio +import requests from typing import TYPE_CHECKING from plexapi.gdm import GDM @@ -15,7 +16,7 @@ async def get_libraries( - mass: MusicAssistant, auth_token: str, local_server_ip: str, local_server_port: str + mass: MusicAssistant, auth_token: str, local_server_ssl: bool, local_server_ip: str, local_server_port: str, local_server_verify_cert: bool ) -> list[str]: """ Get all music libraries for all plex servers. @@ -27,8 +28,11 @@ async def get_libraries( def _get_libraries(): # create a listing of available music libraries on all servers all_libraries: list[str] = [] + session = requests.Session() + session.verify = local_server_verify_cert + local_server_protocol = "https" if local_server_ssl else "http" plex_server: PlexServer = PlexServer( - f"http://{local_server_ip}:{local_server_port}", auth_token + f"{local_server_protocol}://{local_server_ip}:{local_server_port}", auth_token, session=session ) for media_section in plex_server.library.sections(): media_section: PlexLibrarySection