コード例 #1
0
ファイル: test_gdm.py プロジェクト: raleeper/python-plexapi
def test_gdm(plex):
    gdm = GDM()

    gdm_enabled = plex.settings.get("GdmEnabled")

    gdm.scan(timeout=2)
    if gdm_enabled:
        assert len(gdm.entries)
    else:
        assert not len(gdm.entries)
コード例 #2
0
ファイル: __init__.py プロジェクト: qq840873731/core-1
async def async_setup(hass, config):
    """Set up the Plex component."""
    hass.data.setdefault(
        PLEX_DOMAIN,
        {
            SERVERS: {},
            DISPATCHERS: {},
            WEBSOCKETS: {},
            PLATFORMS_COMPLETED: {}
        },
    )

    await async_setup_services(hass)

    gdm = hass.data[PLEX_DOMAIN][GDM_SCANNER] = GDM()

    hass.data[PLEX_DOMAIN][GDM_DEBOUNCER] = Debouncer(
        hass,
        _LOGGER,
        cooldown=10,
        immediate=True,
        function=partial(gdm.scan, scan_for_clients=True),
    ).async_call

    return True
コード例 #3
0
ファイル: __init__.py プロジェクト: 2Fake/core
async def async_setup(hass: HomeAssistant, config: ConfigType) -> bool:
    """Set up the Plex component."""
    hass.data.setdefault(
        PLEX_DOMAIN,
        {
            SERVERS: {},
            DISPATCHERS: {},
            WEBSOCKETS: {},
            PLATFORMS_COMPLETED: {}
        },
    )

    await async_setup_services(hass)

    gdm = hass.data[PLEX_DOMAIN][GDM_SCANNER] = GDM()

    def gdm_scan():
        _LOGGER.debug("Scanning for GDM clients")
        gdm.scan(scan_for_clients=True)

    hass.data[PLEX_DOMAIN][GDM_DEBOUNCER] = Debouncer(
        hass,
        _LOGGER,
        cooldown=10,
        immediate=True,
        function=gdm_scan,
    ).async_call

    return True
コード例 #4
0
async def async_discover(hass):
    """Scan for available Plex servers."""
    gdm = GDM()
    await hass.async_add_executor_job(gdm.scan)
    for server_data in gdm.entries:
        await hass.config_entries.flow.async_init(
            DOMAIN,
            context={CONF_SOURCE: config_entries.SOURCE_INTEGRATION_DISCOVERY},
            data=server_data,
        )
コード例 #5
0
    def __init__(self):
        self._monitor = Monitor()
        self._gdm = GDM()
        self._servers = {}

        self._start()
コード例 #6
0
class DiscoveryService:
    """Class that handles discovery of Plex servers on the local network"""
    def __init__(self):
        self._monitor = Monitor()
        self._gdm = GDM()
        self._servers = {}

        self._start()

    def _discover(self):
        """Uses plexapi's GDM class to discover servers"""
        servers = self._gdm.find_by_content_type('plex/media-server')

        for server in servers:
            plexServer = PlexServer.fromData(server)
            if plexServer:
                self._addServer(plexServer)

    def _addServer(self, server: PlexServer):
        """Add a discovered PMS server as a MediaProvider to the Kodi mediaimport system

        :param server: The discovered PlexServer to add into the Kodi mediaimport system
        :type server: :class:`PlexServer`
        """
        registerServer = False

        # check if the server is already known
        if server.id not in self._servers:
            self._servers[server.id] = server
            registerServer = True
        else:
            # check if the server has already been registered or if some of its properties have changed
            if (not self._servers[server.id].registered
                    or self._servers[server.id].name != server.name
                    or self._servers[server.id].address != server.address):
                self._servers[server.id] = server
                registerServer = True
            else:
                # simply update the server's last seen property
                self._servers[server.id].lastseen = server.lastseen

        # if the server doesn't need to be registered there's nothing else to do
        if not registerServer:
            return

        providerId = Server.BuildProviderId(server.id)
        providerIconUrl = getIcon()

        provider = xbmcmediaimport.MediaProvider(
            providerId, server.name, providerIconUrl,
            plex.constants.SUPPORTED_MEDIA_TYPES)

        # store local authentication in settings
        providerSettings = provider.prepareSettings()
        if not providerSettings:
            return

        ProviderSettings.SetUrl(providerSettings, server.address)
        ProviderSettings.SetAuthenticationMethod(providerSettings, \
            plex.constants.SETTINGS_PROVIDER_AUTHENTICATION_OPTION_LOCAL)
        providerSettings.save()

        if xbmcmediaimport.addAndActivateProvider(provider):
            self._servers[server.id].registered = True
            log(
                f"Plex Media Server {mediaProvider2str(provider)} successfully added and activated",
                xbmc.LOGINFO)
        else:
            self._servers[server.id].registered = False
            log(
                f"failed to add and/or activate Plex Media Server {mediaProvider2str(provider)}",
                xbmc.LOGINFO)

    def _expireServers(self):
        """Check registered Plex servers against timeout and expire any inactive ones"""
        for serverId, server in iteritems(self._servers):
            if not server.isExpired(10):
                continue

            server.registered = False
            xbmcmediaimport.deactivateProvider(serverId)
            log(
                f"Plex Media Server '{server.name}' ({server.id}) deactivated due to inactivity",
                xbmc.LOGINFO)

    def _start(self):
        """Start the discovery and registration process"""
        log('Looking for Plex Media Servers...')

        while not self._monitor.abortRequested():
            # try to discover Plex media servers
            self._discover()

            # expire Plex media servers that haven't responded for a while
            self._expireServers()

            if self._monitor.waitForAbort(1):
                break