From 53fab6239a222164f5aadf406262a06d70de4212 Mon Sep 17 00:00:00 2001 From: Hellowlol Date: Sun, 26 Feb 2017 22:47:40 +0100 Subject: [PATCH] fix tests for download logs/dbs fix clients. Clients now tries to get info from plex.tv resources in the port is missing. add quote_plus to compat --- plexapi/compat.py | 6 +++++- plexapi/media.py | 5 +++++ plexapi/server.py | 32 ++++++++++++++++++++++++-------- tests/test_server.py | 8 ++++---- 4 files changed, 38 insertions(+), 13 deletions(-) diff --git a/plexapi/compat.py b/plexapi/compat.py index 78cddc10..89372bb6 100644 --- a/plexapi/compat.py +++ b/plexapi/compat.py @@ -17,6 +17,11 @@ try: except ImportError: from urllib import quote +try: + from urllib.parse import quote_plus +except ImportError: + from urllib import quote_plus + try: from urllib.parse import unquote except ImportError: @@ -31,4 +36,3 @@ try: from xml.etree import cElementTree as ElementTree except ImportError: from xml.etree import ElementTree - \ No newline at end of file diff --git a/plexapi/media.py b/plexapi/media.py index e31dc8de..5ff25a44 100644 --- a/plexapi/media.py +++ b/plexapi/media.py @@ -1,6 +1,7 @@ # -*- coding: utf-8 -*- from plexapi import utils from plexapi.base import PlexObject +from plexapi.compat import quote_plus from plexapi.exceptions import BadRequest from plexapi.utils import cast @@ -283,6 +284,10 @@ class TranscodeSession(PlexObject): self.videoDecision = data.attrib.get('videoDecision') self.width = cast(int, data.attrib.get('width')) + def stop(self, reason=''): + key = '/status/sessions/terminate?sessionId=%s&reason=%s' % (self.key, quote_plus(reason)) + return self._server.query(key) + class MediaTag(PlexObject): """ Base class for media tags used for filtering and searching your library diff --git a/plexapi/server.py b/plexapi/server.py index b5190201..b25a291a 100644 --- a/plexapi/server.py +++ b/plexapi/server.py @@ -174,12 +174,28 @@ class PlexServer(PlexObject): def clients(self): """ Returns a list of all :class:`~plexapi.client.PlexClient` objects - connected to this server. - """ + connected to this server.""" + items = [] + cache_resource = None + from plexapi.myplex import MyPlexResource for elem in self.query('/clients'): - baseurl = 'http://%s:%s' % (elem.attrib['host'], elem.attrib['port']) - items.append(PlexClient(baseurl, server=self, data=elem)) + # Some shitty clients dont include a port.. + port = elem.attrib.get('port') + if port is None: + log.debug("%s didn't provide a port. Checking https://plex.tv/devices.xml" % elem.attrib.get('name')) + data = cache_resource or self._server._session.get('https://plex.tv/devices.xml?X-Plex-Token=%s' % self.token) + cache_resource = data + resources = MyPlexResource(self, data) + for resource in resources: + if resource.clientIdentifier == elem.attrib.get('machineIdentifier'): + for conn in resource.connection: + if conn.local is True: + port = conn.port + break + + baseurl = 'http://%s:%s' % (elem.attrib['host'], port) + items.append(PlexClient(baseurl=baseurl, server=self, data=elem)) return items def client(self, name): @@ -326,14 +342,14 @@ class PlexServer(PlexObject): return '%s%s%sX-Plex-Token=%s' % (self._baseurl, key, delim, self._token) return '%s%s' % (self._baseurl, key) - def downloadLog(self, savepath=None, unpack=False): + def downloadLogs(self, savepath=None, unpack=False): url = self.url('/diagnostics/databases') - fp = utils.download(url, filename=None, savepath=savepath, unpack=unpack) + fp = utils.download(url, filename=None, savepath=savepath, unpack=unpack, session=self._session) return fp - def downloadDB(self, savepath=None, unpack=False): + def downloadDBS(self, savepath=None, unpack=False): url = self.url('/diagnostics/logs') - fp = utils.download(url, filename=None, savepath=savepath, unpack=unpack) + fp = utils.download(url, filename=None, savepath=savepath, unpack=unpack, session=self._session) return fp diff --git a/tests/test_server.py b/tests/test_server.py index 08567805..ebfaff5d 100644 --- a/tests/test_server.py +++ b/tests/test_server.py @@ -209,10 +209,10 @@ def test_server_account(pms): def test_server_downloadLogs(tmpdir, pms): - pms.downloadLogs(savepath=tmpdir, unpack=True) - assert len(os.listdir(tmpdir)) > 1 + pms.downloadLogs(savepath=str(tmpdir), unpack=True) + assert len(tmpdir.listdir()) > 1 def test_server_downloadDB(tmpdir, pms): - pms.downloadDB(savepath=tmpdir, unpack=True) - assert len(os.listdir(tmpdir)) > 1 + pms.downloadDBS(savepath=str(tmpdir), unpack=True) + assert len(tmpdir.listdir()) > 1