92 lines
2.6 KiB
Python
92 lines
2.6 KiB
Python
"""Services for the Plex integration."""
|
|
import logging
|
|
|
|
from plexapi.exceptions import NotFound
|
|
import voluptuous as vol
|
|
|
|
from homeassistant.helpers.dispatcher import async_dispatcher_send
|
|
|
|
from .const import (
|
|
DOMAIN,
|
|
PLEX_UPDATE_PLATFORMS_SIGNAL,
|
|
SERVERS,
|
|
SERVICE_REFRESH_LIBRARY,
|
|
SERVICE_SCAN_CLIENTS,
|
|
)
|
|
|
|
REFRESH_LIBRARY_SCHEMA = vol.Schema(
|
|
{vol.Optional("server_name"): str, vol.Required("library_name"): str}
|
|
)
|
|
|
|
_LOGGER = logging.getLogger(__package__)
|
|
|
|
|
|
async def async_setup_services(hass):
|
|
"""Set up services for the Plex component."""
|
|
|
|
async def async_refresh_library_service(service_call):
|
|
await hass.async_add_executor_job(refresh_library, hass, service_call)
|
|
|
|
async def async_scan_clients_service(_):
|
|
_LOGGER.debug("Scanning for new Plex clients")
|
|
for server_id in hass.data[DOMAIN][SERVERS]:
|
|
async_dispatcher_send(hass, PLEX_UPDATE_PLATFORMS_SIGNAL.format(server_id))
|
|
|
|
hass.services.async_register(
|
|
DOMAIN,
|
|
SERVICE_REFRESH_LIBRARY,
|
|
async_refresh_library_service,
|
|
schema=REFRESH_LIBRARY_SCHEMA,
|
|
)
|
|
hass.services.async_register(
|
|
DOMAIN, SERVICE_SCAN_CLIENTS, async_scan_clients_service
|
|
)
|
|
|
|
return True
|
|
|
|
|
|
def refresh_library(hass, service_call):
|
|
"""Scan a Plex library for new and updated media."""
|
|
plex_server_name = service_call.data.get("server_name")
|
|
library_name = service_call.data["library_name"]
|
|
|
|
plex_server = get_plex_server(hass, plex_server_name)
|
|
if not plex_server:
|
|
return
|
|
|
|
try:
|
|
library = plex_server.library.section(title=library_name)
|
|
except NotFound:
|
|
_LOGGER.error(
|
|
"Library with name '%s' not found in %s",
|
|
library_name,
|
|
[x.title for x in plex_server.library.sections()],
|
|
)
|
|
return
|
|
|
|
_LOGGER.debug("Scanning %s for new and updated media", library_name)
|
|
library.update()
|
|
|
|
|
|
def get_plex_server(hass, plex_server_name=None):
|
|
"""Retrieve a configured Plex server by name."""
|
|
plex_servers = hass.data[DOMAIN][SERVERS].values()
|
|
|
|
if plex_server_name:
|
|
plex_server = [x for x in plex_servers if x.friendly_name == plex_server_name]
|
|
if not plex_server:
|
|
_LOGGER.error(
|
|
"Requested Plex server '%s' not found in %s",
|
|
plex_server_name,
|
|
[x.friendly_name for x in plex_servers],
|
|
)
|
|
return None
|
|
elif len(plex_servers) == 1:
|
|
return next(iter(plex_servers))
|
|
|
|
_LOGGER.error(
|
|
"Multiple Plex servers configured and no selection made: %s",
|
|
[x.friendly_name for x in plex_servers],
|
|
)
|
|
return None
|