Skip to content

Commit

Permalink
Add option to connect to plex server over https
Browse files Browse the repository at this point in the history
  • Loading branch information
tenfire committed Mar 8, 2024
1 parent fb45272 commit c46803f
Show file tree
Hide file tree
Showing 2 changed files with 37 additions and 5 deletions.
34 changes: 31 additions & 3 deletions music_assistant/server/providers/plex/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@

import asyncio
import logging
import requests
from asyncio import TaskGroup
from typing import TYPE_CHECKING, Any

Expand Down Expand Up @@ -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://"
Expand Down Expand Up @@ -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:
Expand Down Expand Up @@ -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(
Expand Down Expand Up @@ -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,
Expand Down Expand Up @@ -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):
Expand Down
8 changes: 6 additions & 2 deletions music_assistant/server/providers/plex/helpers.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
from __future__ import annotations

import asyncio
import requests
from typing import TYPE_CHECKING

from plexapi.gdm import GDM
Expand All @@ -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.
Expand All @@ -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
Expand Down

0 comments on commit c46803f

Please sign in to comment.