diff --git a/plexpy/config.py b/plexpy/config.py
index 43077177..68eb2bd7 100644
--- a/plexpy/config.py
+++ b/plexpy/config.py
@@ -27,6 +27,7 @@ _CONFIG_DEFINITIONS = {
'PMS_PORT': (int, 'PMS', 32400),
'PMS_PASSWORD': (str, 'PMS', ''),
'PMS_TOKEN': (str, 'PMS', ''),
+ 'PMS_SSL': (int, 'General', 0),
'PMS_USERNAME': (str, 'PMS', ''),
'PMS_USE_BIF': (int, 'PMS', 0),
'PMS_UUID': (str, 'PMS', ''),
diff --git a/plexpy/helpers.py b/plexpy/helpers.py
index b59223a0..db544479 100644
--- a/plexpy/helpers.py
+++ b/plexpy/helpers.py
@@ -14,6 +14,7 @@
# along with PlexPy. If not, see .
from operator import itemgetter
+from xml.dom import minidom
import unicodedata
import plexpy
@@ -359,4 +360,36 @@ def get_percent(value1, value2):
else:
percent = 0
- return math.trunc(percent)
\ No newline at end of file
+ return math.trunc(percent)
+
+def parse_xml(unparsed=None):
+ from plexpy import logger
+
+ if unparsed:
+ try:
+ xml_parse = minidom.parseString(unparsed)
+ return xml_parse
+ except Exception, e:
+ logger.warn("Error parsing XML. %s" % e)
+ return []
+ except:
+ logger.warn("Error parsing XML.")
+ return []
+ else:
+ logger.warn("XML parse request made but no data received.")
+ return []
+
+"""
+Validate xml keys to make sure they exist and return their attribute value, return blank value is none found
+"""
+def get_xml_attr(xml_key, attribute, return_bool=False, default_return=''):
+ if xml_key.getAttribute(attribute):
+ if return_bool:
+ return True
+ else:
+ return xml_key.getAttribute(attribute)
+ else:
+ if return_bool:
+ return False
+ else:
+ return default_return
diff --git a/plexpy/http_handler.py b/plexpy/http_handler.py
new file mode 100644
index 00000000..f8b084be
--- /dev/null
+++ b/plexpy/http_handler.py
@@ -0,0 +1,93 @@
+# This file is part of PlexPy.
+#
+# PlexPy is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# PlexPy is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with PlexPy. If not, see .
+
+from plexpy import logger, helpers
+
+from httplib import HTTPSConnection
+from httplib import HTTPConnection
+
+
+class HTTPHandler(object):
+ """
+ Retrieve data from Plex Server
+ """
+
+ def __init__(self, host, port, token):
+ self.host = host
+ self.port = str(port)
+ self.token = token
+
+ """
+ Handle the HTTP requests.
+
+ Output: object
+ """
+ def make_request(self,
+ uri=None, proto='HTTP',
+ request_type='GET',
+ headers=None,
+ output_format='raw',
+ return_type=False):
+
+ valid_request_types = ['GET', 'POST', 'PUT', 'DELETE']
+
+ if request_type.upper() not in valid_request_types:
+ logger.debug(u"HTTP request made but unsupported request type given.")
+ return None
+
+ if uri:
+ if proto.upper() == 'HTTPS':
+ handler = HTTPSConnection(self.host, self.port, timeout=10)
+ else:
+ handler = HTTPConnection(self.host, self.port, timeout=10)
+
+ if uri.find('?') > 0:
+ token_string = '&X-Plex-Token=' + self.token
+ else:
+ token_string = '?X-Plex-Token=' + self.token
+
+ try:
+ if headers:
+ handler.request(request_type, uri + token_string, headers=headers)
+ else:
+ handler.request(request_type, uri + token_string)
+ response = handler.getresponse()
+ request_status = response.status
+ request_content = response.read()
+ content_type = response.getheader('content-type')
+ except IOError, e:
+ logger.warn(u"Failed to access uri endpoint %s with error %s" % (uri, e))
+ return None
+
+ if request_status == 200:
+ if output_format == 'dict':
+ output = helpers.convert_xml_to_dict(request_content)
+ elif output_format == 'json':
+ output = helpers.convert_xml_to_json(request_content)
+ elif output_format == 'xml':
+ output = helpers.parse_xml(request_content)
+ else:
+ output = request_content
+
+ if return_type:
+ return output, content_type
+
+ return output
+ else:
+ logger.warn(u"Failed to access uri endpoint %s. Status code %r" % (uri, request_status))
+ return []
+ else:
+ logger.debug(u"HTTP request made but no enpoint given.")
+ return None
diff --git a/plexpy/plextv.py b/plexpy/plextv.py
index e0f8bb5c..99a6a452 100644
--- a/plexpy/plextv.py
+++ b/plexpy/plextv.py
@@ -13,10 +13,9 @@
# You should have received a copy of the GNU General Public License
# along with PlexPy. If not, see .
-from plexpy import logger, helpers, plexwatch, db
+from plexpy import logger, helpers, plexwatch, db, http_handler
from xml.dom import minidom
-from httplib import HTTPSConnection
import base64
import plexpy
@@ -50,201 +49,93 @@ class PlexTV(object):
Plex.tv authentication
"""
- def __init__(self, username='', password=''):
+ def __init__(self, username=None, password=None):
+ self.protocol = 'HTTPS'
self.username = username
self.password = password
- self.url = 'plex.tv'
- def get_plex_auth(self):
+ self.request_handler = http_handler.HTTPHandler(host='plex.tv',
+ port=443,
+ token=plexpy.CONFIG.PMS_TOKEN)
- http_handler = HTTPSConnection(self.url)
+ def get_plex_auth(self, output_format='raw'):
+ uri = '/users/sign_in.xml'
base64string = base64.encodestring('%s:%s' % (self.username, self.password)).replace('\n', '')
+ headers = {'Content-Type': 'application/xml; charset=utf-8',
+ 'Content-Length': '0',
+ 'X-Plex-Device-Name': 'PlexPy',
+ 'X-Plex-Product': 'PlexPy',
+ 'X-Plex-Version': 'v0.1 dev',
+ 'X-Plex-Client-Identifier': plexpy.CONFIG.PMS_UUID,
+ 'Authorization': 'Basic %s' % base64string + ":"
+ }
- http_handler.request("POST",
- '/users/sign_in.xml',
- headers={'Content-Type': 'application/xml; charset=utf-8',
- 'Content-Length': '0',
- 'X-Plex-Device-Name': 'PlexPy',
- 'X-Plex-Product': 'PlexPy',
- 'X-Plex-Version': 'v0.1 dev',
- 'X-Plex-Client-Identifier': 'f0864d3531d75b19fa9204eaea456515e2502017',
- 'Authorization': 'Basic %s' % base64string + ":"
- })
+ request = self.request_handler.make_request(uri=uri,
+ proto=self.protocol,
+ request_type='POST',
+ headers=headers,
+ output_format=output_format)
- response = http_handler.getresponse()
- request_status = response.status
- request_body = response.read()
- logger.debug(u"Plex.tv response status: %r" % request_status)
- logger.debug(u"Plex.tv response headers: %r" % response.getheaders())
- logger.debug(u"Plex.tv content type: %r" % response.getheader('content-type'))
- logger.debug(u"Plex.tv response body: %r" % request_body)
-
- if request_status == 201:
- logger.info(u"Plex.tv connection successful.")
- return request_body
- elif request_status >= 400 and request_status < 500:
- logger.info(u"Plex.tv request failed: %s" % response.reason)
- return False
- else:
- logger.info(u"Plex.tv notification failed serverside.")
- return False
+ return request
def get_token(self):
-
- plextv_response = self.get_plex_auth()
+ plextv_response = self.get_plex_auth(output_format='xml')
if plextv_response:
- try:
- xml_parse = minidom.parseString(helpers.latinToAscii(plextv_response))
- except IOError, e:
- logger.warn("Error parsing XML for Plex.tv token: %s" % e)
- return False
-
- xml_head = xml_parse.getElementsByTagName('user')
+ xml_head = plextv_response.getElementsByTagName('user')
if not xml_head:
logger.warn("Error parsing XML for Plex.tv token: %s" % e)
- return False
+ return []
auth_token = xml_head[0].getAttribute('authenticationToken')
return auth_token
else:
- return False
+ return []
def get_plextv_user_data(self):
-
- plextv_response = self.get_plex_auth()
+ plextv_response = self.get_plex_auth(output_format='dict')
if plextv_response:
- try:
- user_data = helpers.convert_xml_to_dict(plextv_response)
- except IOError, e:
- logger.warn("Error parsing XML for Plex.tv user data: %s" % e)
- return False
-
- return user_data
+ return plextv_response
else:
- return False
+ return []
def get_plextv_friends(self, output_format=''):
- url_command = '/api/users'
- http_handler = HTTPSConnection(self.url, timeout=10)
+ uri = '/api/users'
+ request = self.request_handler.make_request(uri=uri,
+ proto=self.protocol,
+ request_type='GET',
+ output_format=output_format)
- try:
- http_handler.request("GET", url_command + '?X-Plex-Token=' + plexpy.CONFIG.PMS_TOKEN)
- response = http_handler.getresponse()
- request_status = response.status
- request_content = response.read()
- except IOError, e:
- logger.warn(u"Failed to access friends list. %s" % e)
- return None
-
- if request_status == 200:
- if output_format == 'dict':
- output = helpers.convert_xml_to_dict(request_content)
- elif output_format == 'json':
- output = helpers.convert_xml_to_json(request_content)
- else:
- output = request_content
- else:
- logger.warn(u"Failed to access friends list. Status code %r" % request_status)
- return None
-
- return output
+ return request
def get_plextv_user_details(self, output_format=''):
- url_command = '/users/account'
- http_handler = HTTPSConnection(self.url, timeout=10)
+ uri = '/users/account'
+ request = self.request_handler.make_request(uri=uri,
+ proto=self.protocol,
+ request_type='GET',
+ output_format=output_format)
- try:
- http_handler.request("GET", url_command + '?X-Plex-Token=' + plexpy.CONFIG.PMS_TOKEN)
- response = http_handler.getresponse()
- request_status = response.status
- request_content = response.read()
- except IOError, e:
- logger.warn(u"Failed to access user details. %s" % e)
- return None
-
- if request_status == 200:
- if output_format == 'dict':
- output = helpers.convert_xml_to_dict(request_content)
- elif output_format == 'json':
- output = helpers.convert_xml_to_json(request_content)
- else:
- output = request_content
- else:
- logger.warn(u"Failed to access user details. Status code %r" % request_status)
- return None
-
- return output
+ return request
def get_plextv_server_list(self, output_format=''):
- url_command = '/pms/servers.xml'
- http_handler = HTTPSConnection(self.url, timeout=10)
+ uri = '/pms/servers.xml'
+ request = self.request_handler.make_request(uri=uri,
+ proto=self.protocol,
+ request_type='GET',
+ output_format=output_format)
- try:
- http_handler.request("GET", url_command + '?includeLite=1&X-Plex-Token=' + plexpy.CONFIG.PMS_TOKEN)
- response = http_handler.getresponse()
- request_status = response.status
- request_content = response.read()
- except IOError, e:
- logger.warn(u"Failed to access server list. %s" % e)
- return None
-
- if request_status == 200:
- if output_format == 'dict':
- output = helpers.convert_xml_to_dict(request_content)
- elif output_format == 'json':
- output = helpers.convert_xml_to_json(request_content)
- else:
- output = request_content
- else:
- logger.warn(u"Failed to access server list. Status code %r" % request_status)
- return None
-
- return output
+ return request
def get_plextv_sync_lists(self, machine_id='', output_format=''):
- url_command = '/servers/' + machine_id + '/sync_lists'
- http_handler = HTTPSConnection(self.url, timeout=10)
+ uri = '/servers/' + machine_id + '/sync_lists'
+ request = self.request_handler.make_request(uri=uri,
+ proto=self.protocol,
+ request_type='GET',
+ output_format=output_format)
- try:
- http_handler.request("GET", url_command + '?X-Plex-Token=' + plexpy.CONFIG.PMS_TOKEN)
- response = http_handler.getresponse()
- request_status = response.status
- request_content = response.read()
- except IOError, e:
- logger.warn(u"Failed to access server list. %s" % e)
- return None
-
- if request_status == 200:
- if output_format == 'dict':
- output = helpers.convert_xml_to_dict(request_content)
- elif output_format == 'json':
- output = helpers.convert_xml_to_json(request_content)
- else:
- output = request_content
- else:
- logger.warn(u"Failed to access server list. Status code %r" % request_status)
- return None
-
- return output
-
- """
- Validate xml keys to make sure they exist and return their attribute value, return blank value is none found
- """
- @staticmethod
- def get_xml_attr(xml_key, attribute, return_bool=False, default_return=''):
- if xml_key.getAttribute(attribute):
- if return_bool:
- return True
- else:
- return xml_key.getAttribute(attribute)
- else:
- if return_bool:
- return False
- else:
- return default_return
+ return request
def get_full_users_list(self):
friends_list = self.get_plextv_friends()
@@ -265,13 +156,13 @@ class PlexTV(object):
logger.warn("Error parsing XML for Plex account details.")
else:
for a in xml_head:
- own_details = {"user_id": self.get_xml_attr(a, 'id'),
- "username": self.get_xml_attr(a, 'username'),
- "thumb": self.get_xml_attr(a, 'thumb'),
- "email": self.get_xml_attr(a, 'email'),
- "is_home_user": self.get_xml_attr(a, 'home'),
+ own_details = {"user_id": helpers.get_xml_attr(a, 'id'),
+ "username": helpers.get_xml_attr(a, 'username'),
+ "thumb": helpers.get_xml_attr(a, 'thumb'),
+ "email": helpers.get_xml_attr(a, 'email'),
+ "is_home_user": helpers.get_xml_attr(a, 'home'),
"is_allow_sync": None,
- "is_restricted": self.get_xml_attr(a, 'restricted')
+ "is_restricted": helpers.get_xml_attr(a, 'restricted')
}
users_list.append(own_details)
@@ -288,13 +179,13 @@ class PlexTV(object):
logger.warn("Error parsing XML for Plex friends list.")
else:
for a in xml_head:
- friend = {"user_id": self.get_xml_attr(a, 'id'),
- "username": self.get_xml_attr(a, 'title'),
- "thumb": self.get_xml_attr(a, 'thumb'),
- "email": self.get_xml_attr(a, 'email'),
- "is_home_user": self.get_xml_attr(a, 'home'),
- "is_allow_sync": self.get_xml_attr(a, 'allowSync'),
- "is_restricted": self.get_xml_attr(a, 'restricted')
+ friend = {"user_id": helpers.get_xml_attr(a, 'id'),
+ "username": helpers.get_xml_attr(a, 'title'),
+ "thumb": helpers.get_xml_attr(a, 'thumb'),
+ "email": helpers.get_xml_attr(a, 'email'),
+ "is_home_user": helpers.get_xml_attr(a, 'home'),
+ "is_allow_sync": helpers.get_xml_attr(a, 'allowSync'),
+ "is_restricted": helpers.get_xml_attr(a, 'restricted')
}
users_list.append(friend)
@@ -322,24 +213,24 @@ class PlexTV(object):
logger.warn("Error parsing XML for Plex sync lists.")
else:
for a in xml_head:
- client_id = self.get_xml_attr(a, 'id')
+ client_id = helpers.get_xml_attr(a, 'id')
sync_device = a.getElementsByTagName('Device')
for device in sync_device:
- device_user_id = self.get_xml_attr(device, 'userID')
+ device_user_id = helpers.get_xml_attr(device, 'userID')
try:
device_username = plex_watch.get_user_details(user_id=device_user_id)['username']
device_friendly_name = plex_watch.get_user_details(user_id=device_user_id)['friendly_name']
except:
device_username = ''
device_friendly_name = ''
- device_name = self.get_xml_attr(device, 'name')
- device_product = self.get_xml_attr(device, 'product')
- device_product_version = self.get_xml_attr(device, 'productVersion')
- device_platform = self.get_xml_attr(device, 'platform')
- device_platform_version = self.get_xml_attr(device, 'platformVersion')
- device_type = self.get_xml_attr(device, 'device')
- device_model = self.get_xml_attr(device, 'model')
- device_last_seen = self.get_xml_attr(device, 'lastSeenAt')
+ device_name = helpers.get_xml_attr(device, 'name')
+ device_product = helpers.get_xml_attr(device, 'product')
+ device_product_version = helpers.get_xml_attr(device, 'productVersion')
+ device_platform = helpers.get_xml_attr(device, 'platform')
+ device_platform_version = helpers.get_xml_attr(device, 'platformVersion')
+ device_type = helpers.get_xml_attr(device, 'device')
+ device_model = helpers.get_xml_attr(device, 'model')
+ device_last_seen = helpers.get_xml_attr(device, 'lastSeenAt')
# Filter by user_id
if user_id and user_id != device_user_id:
@@ -348,38 +239,38 @@ class PlexTV(object):
for synced in a.getElementsByTagName('SyncItems'):
sync_item = synced.getElementsByTagName('SyncItem')
for item in sync_item:
- sync_id = self.get_xml_attr(item, 'id')
- sync_version = self.get_xml_attr(item, 'version')
- sync_root_title = self.get_xml_attr(item, 'rootTitle')
- sync_title = self.get_xml_attr(item, 'title')
- sync_metadata_type = self.get_xml_attr(item, 'metadataType')
- sync_content_type = self.get_xml_attr(item, 'contentType')
+ sync_id = helpers.get_xml_attr(item, 'id')
+ sync_version = helpers.get_xml_attr(item, 'version')
+ sync_root_title = helpers.get_xml_attr(item, 'rootTitle')
+ sync_title = helpers.get_xml_attr(item, 'title')
+ sync_metadata_type = helpers.get_xml_attr(item, 'metadataType')
+ sync_content_type = helpers.get_xml_attr(item, 'contentType')
for status in item.getElementsByTagName('Status'):
- status_failure_code = self.get_xml_attr(status, 'failureCode')
- status_failure = self.get_xml_attr(status, 'failure')
- status_state = self.get_xml_attr(status, 'state')
- status_item_count = self.get_xml_attr(status, 'itemsCount')
- status_item_complete_count = self.get_xml_attr(status, 'itemsCompleteCount')
- status_item_downloaded_count = self.get_xml_attr(status, 'itemsDownloadedCount')
- status_item_ready_count = self.get_xml_attr(status, 'itemsReadyCount')
- status_item_successful_count = self.get_xml_attr(status, 'itemsSuccessfulCount')
- status_total_size = self.get_xml_attr(status, 'totalSize')
+ status_failure_code = helpers.get_xml_attr(status, 'failureCode')
+ status_failure = helpers.get_xml_attr(status, 'failure')
+ status_state = helpers.get_xml_attr(status, 'state')
+ status_item_count = helpers.get_xml_attr(status, 'itemsCount')
+ status_item_complete_count = helpers.get_xml_attr(status, 'itemsCompleteCount')
+ status_item_downloaded_count = helpers.get_xml_attr(status, 'itemsDownloadedCount')
+ status_item_ready_count = helpers.get_xml_attr(status, 'itemsReadyCount')
+ status_item_successful_count = helpers.get_xml_attr(status, 'itemsSuccessfulCount')
+ status_total_size = helpers.get_xml_attr(status, 'totalSize')
status_item_download_percent_complete = helpers.get_percent(
status_item_downloaded_count, status_item_count)
for settings in item.getElementsByTagName('MediaSettings'):
- settings_audio_boost = self.get_xml_attr(settings, 'audioBoost')
- settings_music_bitrate = self.get_xml_attr(settings, 'musicBitrate')
- settings_photo_quality = self.get_xml_attr(settings, 'photoQuality')
- settings_photo_resolution = self.get_xml_attr(settings, 'photoResolution')
- settings_video_quality = self.get_xml_attr(settings, 'videoQuality')
- settings_video_resolution = self.get_xml_attr(settings, 'videoResolution')
+ settings_audio_boost = helpers.get_xml_attr(settings, 'audioBoost')
+ settings_music_bitrate = helpers.get_xml_attr(settings, 'musicBitrate')
+ settings_photo_quality = helpers.get_xml_attr(settings, 'photoQuality')
+ settings_photo_resolution = helpers.get_xml_attr(settings, 'photoResolution')
+ settings_video_quality = helpers.get_xml_attr(settings, 'videoQuality')
+ settings_video_resolution = helpers.get_xml_attr(settings, 'videoResolution')
- if self.get_xml_attr(item.getElementsByTagName('Location')[0], 'uri').endswith('%2Fchildren'):
- clean_uri = self.get_xml_attr(item.getElementsByTagName('Location')[0], 'uri')[:-11]
+ if helpers.get_xml_attr(item.getElementsByTagName('Location')[0], 'uri').endswith('%2Fchildren'):
+ clean_uri = helpers.get_xml_attr(item.getElementsByTagName('Location')[0], 'uri')[:-11]
else:
- clean_uri = self.get_xml_attr(item.getElementsByTagName('Location')[0], 'uri')
+ clean_uri = helpers.get_xml_attr(item.getElementsByTagName('Location')[0], 'uri')
rating_key = clean_uri.rpartition('%2F')[-1]
diff --git a/plexpy/pmsconnect.py b/plexpy/pmsconnect.py
index c061a63c..91ae25a6 100644
--- a/plexpy/pmsconnect.py
+++ b/plexpy/pmsconnect.py
@@ -13,11 +13,7 @@
# You should have received a copy of the GNU General Public License
# along with PlexPy. If not, see .
-from plexpy import logger, helpers, plexwatch
-
-from xml.dom import minidom
-from httplib import HTTPSConnection
-from httplib import HTTPConnection
+from plexpy import logger, helpers, plexwatch, http_handler
import plexpy
@@ -28,88 +24,10 @@ class PmsConnect(object):
"""
def __init__(self):
- self.host = plexpy.CONFIG.PMS_IP
- self.port = str(plexpy.CONFIG.PMS_PORT)
- self.token = plexpy.CONFIG.PMS_TOKEN
- self.protocol = 'HTTP'
-
- """
- Return base url of Plex Server.
-
- Output: string
- """
- def get_base_url(self):
- if self.host != '' and self.port != '':
- base_url = self.protocol + self.host + ':' + self.port
- return base_url
- else:
- return False
-
- """
- Handle the HTTP requests.
-
- Output: object
- """
- def make_request(self, uri=None, proto='HTTP', request_type='GET', output_format='xml'):
-
- valid_request_types = ['GET', 'POST', 'PUT', 'DELETE']
-
- if request_type.upper() not in valid_request_types:
- logger.debug(u"HTTP request made but unsupported request type given.")
- return None
-
- if uri:
- if proto.upper() == 'HTTPS':
- handler = HTTPSConnection(self.host, self.port, timeout=10)
- else:
- handler = HTTPConnection(self.host, self.port, timeout=10)
-
- if uri.find('?') > 0:
- token_string = '&X-Plex-Token=' + self.token
- else:
- token_string = '?X-Plex-Token=' + self.token
-
- try:
- handler.request(request_type, uri + token_string)
- response = handler.getresponse()
- request_status = response.status
- request_content = response.read()
- except IOError, e:
- logger.warn(u"Failed to access uri endpoint %s with error %s" % (uri, e))
- return None
-
- if request_status == 200:
- if output_format == 'dict':
- output = helpers.convert_xml_to_dict(request_content)
- elif output_format == 'json':
- output = helpers.convert_xml_to_json(request_content)
- elif output_format == 'xml':
- output = self.parse_xml(request_content)
- else:
- output = request_content
-
- return output
- else:
- logger.warn(u"Failed to access uri endpoint %s. Status code %r" % (uri, request_status))
- return []
- else:
- logger.debug(u"HTTP request made but no enpoint given.")
- return None
-
- def parse_xml(self, unparsed=None):
- if unparsed:
- try:
- xml_parse = minidom.parseString(unparsed)
- return xml_parse
- except Exception, e:
- logger.warn("Error parsing XML for Plex recently added: %s" % e)
- return []
- except:
- logger.warn("Error parsing XML for Plex recently added.")
- return []
- else:
- logger.warn("XML parse request made but no data received.")
- return []
+ self.protocol = 'HTTPS'
+ self.request_handler = http_handler.HTTPHandler(host=plexpy.CONFIG.PMS_IP,
+ port=plexpy.CONFIG.PMS_PORT,
+ token=plexpy.CONFIG.PMS_TOKEN)
"""
Return current sessions.
@@ -120,10 +38,10 @@ class PmsConnect(object):
"""
def get_sessions(self, output_format=''):
uri = '/status/sessions'
- request = self.make_request(uri=uri,
- proto=self.protocol,
- request_type='GET',
- output_format=output_format)
+ request = self.request_handler.make_request(uri=uri,
+ proto=self.protocol,
+ request_type='GET',
+ output_format=output_format)
return request
@@ -137,10 +55,10 @@ class PmsConnect(object):
"""
def get_metadata(self, rating_key='', output_format=''):
uri = '/library/metadata/' + rating_key
- request = self.make_request(uri=uri,
- proto=self.protocol,
- request_type='GET',
- output_format=output_format)
+ request = self.request_handler.make_request(uri=uri,
+ proto=self.protocol,
+ request_type='GET',
+ output_format=output_format)
return request
@@ -154,10 +72,10 @@ class PmsConnect(object):
"""
def get_recently_added(self, count='0', output_format=''):
uri = '/library/recentlyAdded?X-Plex-Container-Start=0&X-Plex-Container-Size=' + count
- request = self.make_request(uri=uri,
- proto=self.protocol,
- request_type='GET',
- output_format=output_format)
+ request = self.request_handler.make_request(uri=uri,
+ proto=self.protocol,
+ request_type='GET',
+ output_format=output_format)
return request
@@ -171,10 +89,10 @@ class PmsConnect(object):
"""
def get_episode_list(self, rating_key='', output_format=''):
uri = '/library/metadata/' + rating_key + '/children'
- request = self.make_request(uri=uri,
- proto=self.protocol,
- request_type='GET',
- output_format=output_format)
+ request = self.request_handler.make_request(uri=uri,
+ proto=self.protocol,
+ request_type='GET',
+ output_format=output_format)
return request
@@ -187,10 +105,10 @@ class PmsConnect(object):
"""
def get_server_list(self, output_format=''):
uri = '/servers'
- request = self.make_request(uri=uri,
- proto=self.protocol,
- request_type='GET',
- output_format=output_format)
+ request = self.request_handler.make_request(uri=uri,
+ proto=self.protocol,
+ request_type='GET',
+ output_format=output_format)
return request
@@ -203,10 +121,10 @@ class PmsConnect(object):
"""
def get_server_prefs(self, output_format=''):
uri = '/:/prefs'
- request = self.make_request(uri=uri,
- proto=self.protocol,
- request_type='GET',
- output_format=output_format)
+ request = self.request_handler.make_request(uri=uri,
+ proto=self.protocol,
+ request_type='GET',
+ output_format=output_format)
return request
@@ -219,10 +137,10 @@ class PmsConnect(object):
"""
def get_local_server_identity(self, output_format=''):
uri = '/identity'
- request = self.make_request(uri=uri,
- proto=self.protocol,
- request_type='GET',
- output_format=output_format)
+ request = self.request_handler.make_request(uri=uri,
+ proto=self.protocol,
+ request_type='GET',
+ output_format=output_format)
return request
@@ -236,10 +154,10 @@ class PmsConnect(object):
"""
def get_sync_item(self, sync_id=None, output_format=''):
uri = '/sync/items/' + sync_id
- request = self.make_request(uri=uri,
- proto=self.protocol,
- request_type='GET',
- output_format=output_format)
+ request = self.request_handler.make_request(uri=uri,
+ proto=self.protocol,
+ request_type='GET',
+ output_format=output_format)
return request
@@ -252,10 +170,10 @@ class PmsConnect(object):
"""
def get_sync_transcode_queue(self, output_format=''):
uri = '/sync/transcodeQueue'
- request = self.make_request(uri=uri,
- proto=self.protocol,
- request_type='GET',
- output_format=output_format)
+ request = self.request_handler.make_request(uri=uri,
+ proto=self.protocol,
+ request_type='GET',
+ output_format=output_format)
return request
@@ -284,14 +202,14 @@ class PmsConnect(object):
if a.getElementsByTagName('Directory'):
recents_main = a.getElementsByTagName('Directory')
for item in recents_main:
- recent_type = self.get_xml_attr(item, 'type')
+ recent_type = helpers.get_xml_attr(item, 'type')
if recent_type == 'season':
recent_items = {'type': recent_type,
- 'ratingKey': self.get_xml_attr(item, 'ratingKey'),
- 'title': self.get_xml_attr(item, 'title'),
- 'thumb': self.get_xml_attr(item, 'thumb'),
- 'addedAt': self.get_xml_attr(item, 'addedAt')
+ 'ratingKey': helpers.get_xml_attr(item, 'ratingKey'),
+ 'title': helpers.get_xml_attr(item, 'title'),
+ 'thumb': helpers.get_xml_attr(item, 'thumb'),
+ 'addedAt': helpers.get_xml_attr(item, 'addedAt')
}
recents_list.append(recent_items)
else:
@@ -300,15 +218,15 @@ class PmsConnect(object):
if a.getElementsByTagName('Video'):
recents_main = a.getElementsByTagName('Video')
for item in recents_main:
- recent_type = self.get_xml_attr(item, 'type')
+ recent_type = helpers.get_xml_attr(item, 'type')
if recent_type == 'movie':
recent_items = {'type': recent_type,
- 'ratingKey': self.get_xml_attr(item, 'ratingKey'),
- 'title': self.get_xml_attr(item, 'title'),
- 'year': self.get_xml_attr(item, 'year'),
- 'thumb': self.get_xml_attr(item, 'thumb'),
- 'addedAt': self.get_xml_attr(item, 'addedAt')
+ 'ratingKey': helpers.get_xml_attr(item, 'ratingKey'),
+ 'title': helpers.get_xml_attr(item, 'title'),
+ 'year': helpers.get_xml_attr(item, 'year'),
+ 'thumb': helpers.get_xml_attr(item, 'thumb'),
+ 'addedAt': helpers.get_xml_attr(item, 'addedAt')
}
recents_list.append(recent_items)
else:
@@ -342,10 +260,10 @@ class PmsConnect(object):
if a.getElementsByTagName('Directory'):
metadata_main = a.getElementsByTagName('Directory')[0]
- metadata_type = self.get_xml_attr(metadata_main, 'type')
+ metadata_type = helpers.get_xml_attr(metadata_main, 'type')
elif a.getElementsByTagName('Video'):
metadata_main = a.getElementsByTagName('Video')[0]
- metadata_type = self.get_xml_attr(metadata_main, 'type')
+ metadata_type = helpers.get_xml_attr(metadata_main, 'type')
else:
logger.debug(u"Metadata failed")
@@ -356,38 +274,38 @@ class PmsConnect(object):
if metadata_main.getElementsByTagName('Genre'):
for genre in metadata_main.getElementsByTagName('Genre'):
- genres.append(self.get_xml_attr(genre, 'tag'))
+ genres.append(helpers.get_xml_attr(genre, 'tag'))
if metadata_main.getElementsByTagName('Role'):
for actor in metadata_main.getElementsByTagName('Role'):
- actors.append(self.get_xml_attr(actor, 'tag'))
+ actors.append(helpers.get_xml_attr(actor, 'tag'))
if metadata_main.getElementsByTagName('Writer'):
for writer in metadata_main.getElementsByTagName('Writer'):
- writers.append(self.get_xml_attr(writer, 'tag'))
+ writers.append(helpers.get_xml_attr(writer, 'tag'))
if metadata_main.getElementsByTagName('Director'):
for director in metadata_main.getElementsByTagName('Director'):
- directors.append(self.get_xml_attr(director, 'tag'))
+ directors.append(helpers.get_xml_attr(director, 'tag'))
if metadata_type == 'show':
metadata = {'type': metadata_type,
- 'rating_key': self.get_xml_attr(metadata_main, 'ratingKey'),
- 'grandparent_title': self.get_xml_attr(metadata_main, 'grandparentTitle'),
- 'parent_index': self.get_xml_attr(metadata_main, 'parentIndex'),
- 'parent_title': self.get_xml_attr(metadata_main, 'parentTitle'),
- 'index': self.get_xml_attr(metadata_main, 'index'),
- 'studio': self.get_xml_attr(metadata_main, 'studio'),
- 'title': self.get_xml_attr(metadata_main, 'title'),
- 'content_rating': self.get_xml_attr(metadata_main, 'contentRating'),
- 'summary': self.get_xml_attr(metadata_main, 'summary'),
- 'rating': self.get_xml_attr(metadata_main, 'rating'),
- 'duration': helpers.convert_milliseconds_to_minutes(self.get_xml_attr(metadata_main, 'duration')),
- 'year': self.get_xml_attr(metadata_main, 'year'),
- 'thumb': self.get_xml_attr(metadata_main, 'thumb'),
- 'parent_thumb': self.get_xml_attr(metadata_main, 'parentThumb'),
- 'art': self.get_xml_attr(metadata_main, 'art'),
- 'originally_available_at': self.get_xml_attr(metadata_main, 'originallyAvailableAt'),
+ 'rating_key': helpers.get_xml_attr(metadata_main, 'ratingKey'),
+ 'grandparent_title': helpers.get_xml_attr(metadata_main, 'grandparentTitle'),
+ 'parent_index': helpers.get_xml_attr(metadata_main, 'parentIndex'),
+ 'parent_title': helpers.get_xml_attr(metadata_main, 'parentTitle'),
+ 'index': helpers.get_xml_attr(metadata_main, 'index'),
+ 'studio': helpers.get_xml_attr(metadata_main, 'studio'),
+ 'title': helpers.get_xml_attr(metadata_main, 'title'),
+ 'content_rating': helpers.get_xml_attr(metadata_main, 'contentRating'),
+ 'summary': helpers.get_xml_attr(metadata_main, 'summary'),
+ 'rating': helpers.get_xml_attr(metadata_main, 'rating'),
+ 'duration': helpers.convert_milliseconds_to_minutes(helpers.get_xml_attr(metadata_main, 'duration')),
+ 'year': helpers.get_xml_attr(metadata_main, 'year'),
+ 'thumb': helpers.get_xml_attr(metadata_main, 'thumb'),
+ 'parent_thumb': helpers.get_xml_attr(metadata_main, 'parentThumb'),
+ 'art': helpers.get_xml_attr(metadata_main, 'art'),
+ 'originally_available_at': helpers.get_xml_attr(metadata_main, 'originallyAvailableAt'),
'writers': writers,
'directors': directors,
'genres': genres,
@@ -396,22 +314,22 @@ class PmsConnect(object):
metadata_list = {'metadata': metadata}
elif metadata_type == 'episode':
metadata = {'type': metadata_type,
- 'rating_key': self.get_xml_attr(metadata_main, 'ratingKey'),
- 'grandparent_title': self.get_xml_attr(metadata_main, 'grandparentTitle'),
- 'parent_index': self.get_xml_attr(metadata_main, 'parentIndex'),
- 'parent_title': self.get_xml_attr(metadata_main, 'parentTitle'),
- 'index': self.get_xml_attr(metadata_main, 'index'),
- 'studio': self.get_xml_attr(metadata_main, 'studio'),
- 'title': self.get_xml_attr(metadata_main, 'title'),
- 'content_rating': self.get_xml_attr(metadata_main, 'contentRating'),
- 'summary': self.get_xml_attr(metadata_main, 'summary'),
- 'rating': self.get_xml_attr(metadata_main, 'rating'),
- 'duration': helpers.convert_milliseconds_to_minutes(self.get_xml_attr(metadata_main, 'duration')),
- 'year': self.get_xml_attr(metadata_main, 'year'),
- 'thumb': self.get_xml_attr(metadata_main, 'thumb'),
- 'parent_thumb': self.get_xml_attr(metadata_main, 'parentThumb'),
- 'art': self.get_xml_attr(metadata_main, 'art'),
- 'originally_available_at': self.get_xml_attr(metadata_main, 'originallyAvailableAt'),
+ 'rating_key': helpers.get_xml_attr(metadata_main, 'ratingKey'),
+ 'grandparent_title': helpers.get_xml_attr(metadata_main, 'grandparentTitle'),
+ 'parent_index': helpers.get_xml_attr(metadata_main, 'parentIndex'),
+ 'parent_title': helpers.get_xml_attr(metadata_main, 'parentTitle'),
+ 'index': helpers.get_xml_attr(metadata_main, 'index'),
+ 'studio': helpers.get_xml_attr(metadata_main, 'studio'),
+ 'title': helpers.get_xml_attr(metadata_main, 'title'),
+ 'content_rating': helpers.get_xml_attr(metadata_main, 'contentRating'),
+ 'summary': helpers.get_xml_attr(metadata_main, 'summary'),
+ 'rating': helpers.get_xml_attr(metadata_main, 'rating'),
+ 'duration': helpers.convert_milliseconds_to_minutes(helpers.get_xml_attr(metadata_main, 'duration')),
+ 'year': helpers.get_xml_attr(metadata_main, 'year'),
+ 'thumb': helpers.get_xml_attr(metadata_main, 'thumb'),
+ 'parent_thumb': helpers.get_xml_attr(metadata_main, 'parentThumb'),
+ 'art': helpers.get_xml_attr(metadata_main, 'art'),
+ 'originally_available_at': helpers.get_xml_attr(metadata_main, 'originallyAvailableAt'),
'writers': writers,
'directors': directors,
'genres': genres,
@@ -420,22 +338,22 @@ class PmsConnect(object):
metadata_list = {'metadata': metadata}
elif metadata_type == 'movie':
metadata = {'type': metadata_type,
- 'rating_key': self.get_xml_attr(metadata_main, 'ratingKey'),
- 'grandparent_title': self.get_xml_attr(metadata_main, 'grandparentTitle'),
- 'parent_index': self.get_xml_attr(metadata_main, 'parentIndex'),
- 'parent_title': self.get_xml_attr(metadata_main, 'parentTitle'),
- 'index': self.get_xml_attr(metadata_main, 'index'),
- 'studio': self.get_xml_attr(metadata_main, 'studio'),
- 'title': self.get_xml_attr(metadata_main, 'title'),
- 'content_rating': self.get_xml_attr(metadata_main, 'contentRating'),
- 'summary': self.get_xml_attr(metadata_main, 'summary'),
- 'rating': self.get_xml_attr(metadata_main, 'rating'),
- 'duration': helpers.convert_milliseconds_to_minutes(self.get_xml_attr(metadata_main, 'duration')),
- 'year': self.get_xml_attr(metadata_main, 'year'),
- 'thumb': self.get_xml_attr(metadata_main, 'thumb'),
- 'parent_thumb': self.get_xml_attr(metadata_main, 'parentThumb'),
- 'art': self.get_xml_attr(metadata_main, 'art'),
- 'originally_available_at': self.get_xml_attr(metadata_main, 'originallyAvailableAt'),
+ 'rating_key': helpers.get_xml_attr(metadata_main, 'ratingKey'),
+ 'grandparent_title': helpers.get_xml_attr(metadata_main, 'grandparentTitle'),
+ 'parent_index': helpers.get_xml_attr(metadata_main, 'parentIndex'),
+ 'parent_title': helpers.get_xml_attr(metadata_main, 'parentTitle'),
+ 'index': helpers.get_xml_attr(metadata_main, 'index'),
+ 'studio': helpers.get_xml_attr(metadata_main, 'studio'),
+ 'title': helpers.get_xml_attr(metadata_main, 'title'),
+ 'content_rating': helpers.get_xml_attr(metadata_main, 'contentRating'),
+ 'summary': helpers.get_xml_attr(metadata_main, 'summary'),
+ 'rating': helpers.get_xml_attr(metadata_main, 'rating'),
+ 'duration': helpers.convert_milliseconds_to_minutes(helpers.get_xml_attr(metadata_main, 'duration')),
+ 'year': helpers.get_xml_attr(metadata_main, 'year'),
+ 'thumb': helpers.get_xml_attr(metadata_main, 'thumb'),
+ 'parent_thumb': helpers.get_xml_attr(metadata_main, 'parentThumb'),
+ 'art': helpers.get_xml_attr(metadata_main, 'art'),
+ 'originally_available_at': helpers.get_xml_attr(metadata_main, 'originallyAvailableAt'),
'genres': genres,
'actors': actors,
'writers': writers,
@@ -443,25 +361,25 @@ class PmsConnect(object):
}
metadata_list = {'metadata': metadata}
elif metadata_type == 'season':
- parent_rating_key = self.get_xml_attr(metadata_main, 'parentRatingKey')
+ parent_rating_key = helpers.get_xml_attr(metadata_main, 'parentRatingKey')
show_details = self.get_metadata_details(parent_rating_key)
metadata = {'type': metadata_type,
- 'rating_key': self.get_xml_attr(metadata_main, 'ratingKey'),
- 'grandparent_title': self.get_xml_attr(metadata_main, 'grandparentTitle'),
- 'parent_index': self.get_xml_attr(metadata_main, 'parentIndex'),
- 'parent_title': self.get_xml_attr(metadata_main, 'parentTitle'),
- 'index': self.get_xml_attr(metadata_main, 'index'),
- 'studio': self.get_xml_attr(metadata_main, 'studio'),
- 'title': self.get_xml_attr(metadata_main, 'title'),
- 'content_rating': self.get_xml_attr(metadata_main, 'contentRating'),
+ 'rating_key': helpers.get_xml_attr(metadata_main, 'ratingKey'),
+ 'grandparent_title': helpers.get_xml_attr(metadata_main, 'grandparentTitle'),
+ 'parent_index': helpers.get_xml_attr(metadata_main, 'parentIndex'),
+ 'parent_title': helpers.get_xml_attr(metadata_main, 'parentTitle'),
+ 'index': helpers.get_xml_attr(metadata_main, 'index'),
+ 'studio': helpers.get_xml_attr(metadata_main, 'studio'),
+ 'title': helpers.get_xml_attr(metadata_main, 'title'),
+ 'content_rating': helpers.get_xml_attr(metadata_main, 'contentRating'),
'summary': show_details['metadata']['summary'],
- 'rating': self.get_xml_attr(metadata_main, 'rating'),
+ 'rating': helpers.get_xml_attr(metadata_main, 'rating'),
'duration': show_details['metadata']['duration'],
- 'year': self.get_xml_attr(metadata_main, 'year'),
- 'thumb': self.get_xml_attr(metadata_main, 'thumb'),
- 'parent_thumb': self.get_xml_attr(metadata_main, 'parentThumb'),
- 'art': self.get_xml_attr(metadata_main, 'art'),
- 'originally_available_at': self.get_xml_attr(metadata_main, 'originallyAvailableAt'),
+ 'year': helpers.get_xml_attr(metadata_main, 'year'),
+ 'thumb': helpers.get_xml_attr(metadata_main, 'thumb'),
+ 'parent_thumb': helpers.get_xml_attr(metadata_main, 'parentThumb'),
+ 'art': helpers.get_xml_attr(metadata_main, 'art'),
+ 'originally_available_at': helpers.get_xml_attr(metadata_main, 'originallyAvailableAt'),
'genres': genres,
'actors': actors,
'writers': writers,
@@ -473,22 +391,6 @@ class PmsConnect(object):
return metadata_list
- """
- Validate xml keys to make sure they exist and return their attribute value, return blank value is none found
- """
- @staticmethod
- def get_xml_attr(xml_key, attribute, return_bool=False, default_return=''):
- if xml_key.getAttribute(attribute):
- if return_bool:
- return True
- else:
- return xml_key.getAttribute(attribute)
- else:
- if return_bool:
- return False
- else:
- return default_return
-
"""
Return processed and validated session list.
@@ -524,7 +426,7 @@ class PmsConnect(object):
session_output = self.get_session_each(session_type, session)
session_list.append(session_output)
- output = {'stream_count': self.get_xml_attr(xml_head[0], 'size'),
+ output = {'stream_count': helpers.get_xml_attr(xml_head[0], 'size'),
'sessions': session_list
}
@@ -544,32 +446,32 @@ class PmsConnect(object):
if stream_type == 'track':
if session.getElementsByTagName('TranscodeSession'):
transcode_session = session.getElementsByTagName('TranscodeSession')[0]
- audio_decision = self.get_xml_attr(transcode_session, 'audioDecision')
- audio_channels = self.get_xml_attr(transcode_session, 'audioChannels')
- audio_codec = self.get_xml_attr(transcode_session, 'audioCodec')
- duration = self.get_xml_attr(transcode_session, 'duration')
- progress = self.get_xml_attr(session, 'viewOffset')
+ audio_decision = helpers.get_xml_attr(transcode_session, 'audioDecision')
+ audio_channels = helpers.get_xml_attr(transcode_session, 'audioChannels')
+ audio_codec = helpers.get_xml_attr(transcode_session, 'audioCodec')
+ duration = helpers.get_xml_attr(transcode_session, 'duration')
+ progress = helpers.get_xml_attr(session, 'viewOffset')
else:
media_info = session.getElementsByTagName('Media')[0]
audio_decision = 'direct play'
- audio_channels = self.get_xml_attr(media_info, 'audioChannels')
- audio_codec = self.get_xml_attr(media_info, 'audioCodec')
- duration = self.get_xml_attr(media_info, 'duration')
- progress = self.get_xml_attr(session, 'viewOffset')
+ audio_channels = helpers.get_xml_attr(media_info, 'audioChannels')
+ audio_codec = helpers.get_xml_attr(media_info, 'audioCodec')
+ duration = helpers.get_xml_attr(media_info, 'duration')
+ progress = helpers.get_xml_attr(session, 'viewOffset')
- session_output = {'session_key': self.get_xml_attr(session, 'sessionKey'),
- 'art': self.get_xml_attr(session, 'art'),
- 'parent_thumb': self.get_xml_attr(session, 'parentThumb'),
- 'thumb': self.get_xml_attr(session, 'thumb'),
- 'user': self.get_xml_attr(session.getElementsByTagName('User')[0], 'title'),
+ session_output = {'session_key': helpers.get_xml_attr(session, 'sessionKey'),
+ 'art': helpers.get_xml_attr(session, 'art'),
+ 'parent_thumb': helpers.get_xml_attr(session, 'parentThumb'),
+ 'thumb': helpers.get_xml_attr(session, 'thumb'),
+ 'user': helpers.get_xml_attr(session.getElementsByTagName('User')[0], 'title'),
'friendly_name': plex_watch.get_user_friendly_name(
- self.get_xml_attr(session.getElementsByTagName('User')[0], 'title')),
- 'player': self.get_xml_attr(session.getElementsByTagName('Player')[0], 'platform'),
- 'state': self.get_xml_attr(session.getElementsByTagName('Player')[0], 'state'),
- 'grandparent_title': self.get_xml_attr(session, 'grandparentTitle'),
- 'parent_title': self.get_xml_attr(session, 'parentTitle'),
- 'title': self.get_xml_attr(session, 'title'),
- 'rating_key': self.get_xml_attr(session, 'ratingKey'),
+ helpers.get_xml_attr(session.getElementsByTagName('User')[0], 'title')),
+ 'player': helpers.get_xml_attr(session.getElementsByTagName('Player')[0], 'platform'),
+ 'state': helpers.get_xml_attr(session.getElementsByTagName('Player')[0], 'state'),
+ 'grandparent_title': helpers.get_xml_attr(session, 'grandparentTitle'),
+ 'parent_title': helpers.get_xml_attr(session, 'parentTitle'),
+ 'title': helpers.get_xml_attr(session, 'title'),
+ 'rating_key': helpers.get_xml_attr(session, 'ratingKey'),
'audio_decision': audio_decision,
'audio_channels': audio_channels,
'audio_codec': audio_codec,
@@ -586,31 +488,31 @@ class PmsConnect(object):
elif stream_type == 'video':
if session.getElementsByTagName('TranscodeSession'):
transcode_session = session.getElementsByTagName('TranscodeSession')[0]
- audio_decision = self.get_xml_attr(transcode_session, 'audioDecision')
- audio_channels = self.get_xml_attr(transcode_session, 'audioChannels')
- audio_codec = self.get_xml_attr(transcode_session, 'audioCodec')
- video_decision = self.get_xml_attr(transcode_session, 'videoDecision')
- video_codec = self.get_xml_attr(transcode_session, 'videoCodec')
- width = self.get_xml_attr(transcode_session, 'width')
- height = self.get_xml_attr(transcode_session, 'height')
- duration = self.get_xml_attr(session, 'duration')
- progress = self.get_xml_attr(session, 'viewOffset')
+ audio_decision = helpers.get_xml_attr(transcode_session, 'audioDecision')
+ audio_channels = helpers.get_xml_attr(transcode_session, 'audioChannels')
+ audio_codec = helpers.get_xml_attr(transcode_session, 'audioCodec')
+ video_decision = helpers.get_xml_attr(transcode_session, 'videoDecision')
+ video_codec = helpers.get_xml_attr(transcode_session, 'videoCodec')
+ width = helpers.get_xml_attr(transcode_session, 'width')
+ height = helpers.get_xml_attr(transcode_session, 'height')
+ duration = helpers.get_xml_attr(session, 'duration')
+ progress = helpers.get_xml_attr(session, 'viewOffset')
else:
media_info = session.getElementsByTagName('Media')[0]
audio_decision = 'direct play'
- audio_channels = self.get_xml_attr(media_info, 'audioChannels')
- audio_codec = self.get_xml_attr(media_info, 'audioCodec')
+ audio_channels = helpers.get_xml_attr(media_info, 'audioChannels')
+ audio_codec = helpers.get_xml_attr(media_info, 'audioCodec')
video_decision = 'direct play'
- video_codec = self.get_xml_attr(media_info, 'videoCodec')
- width = self.get_xml_attr(media_info, 'width')
- height = self.get_xml_attr(media_info, 'height')
- duration = self.get_xml_attr(media_info, 'duration')
- progress = self.get_xml_attr(session, 'viewOffset')
+ video_codec = helpers.get_xml_attr(media_info, 'videoCodec')
+ width = helpers.get_xml_attr(media_info, 'width')
+ height = helpers.get_xml_attr(media_info, 'height')
+ duration = helpers.get_xml_attr(media_info, 'duration')
+ progress = helpers.get_xml_attr(session, 'viewOffset')
media_info = session.getElementsByTagName('Media')[0]
if media_info.getElementsByTagName('Part'):
- indexes = self.get_xml_attr(media_info.getElementsByTagName('Part')[0], 'indexes')
- part_id = self.get_xml_attr(media_info.getElementsByTagName('Part')[0], 'id')
+ indexes = helpers.get_xml_attr(media_info.getElementsByTagName('Part')[0], 'indexes')
+ part_id = helpers.get_xml_attr(media_info.getElementsByTagName('Part')[0], 'id')
if indexes == 'sd':
bif_thumb = '/library/parts/' + part_id + '/indexes/sd/' + progress
else:
@@ -623,23 +525,23 @@ class PmsConnect(object):
thumb = bif_thumb
use_indexes = 1
else:
- thumb = self.get_xml_attr(session, 'thumb')
+ thumb = helpers.get_xml_attr(session, 'thumb')
use_indexes = 0
- if self.get_xml_attr(session, 'type') == 'episode':
- session_output = {'session_key': self.get_xml_attr(session, 'sessionKey'),
- 'art': self.get_xml_attr(session, 'art'),
- 'parent_thumb': self.get_xml_attr(session, 'parentThumb'),
+ if helpers.get_xml_attr(session, 'type') == 'episode':
+ session_output = {'session_key': helpers.get_xml_attr(session, 'sessionKey'),
+ 'art': helpers.get_xml_attr(session, 'art'),
+ 'parent_thumb': helpers.get_xml_attr(session, 'parentThumb'),
'thumb': thumb,
- 'user': self.get_xml_attr(session.getElementsByTagName('User')[0], 'title'),
+ 'user': helpers.get_xml_attr(session.getElementsByTagName('User')[0], 'title'),
'friendly_name': plex_watch.get_user_friendly_name(
- self.get_xml_attr(session.getElementsByTagName('User')[0], 'title')),
- 'player': self.get_xml_attr(session.getElementsByTagName('Player')[0], 'platform'),
- 'state': self.get_xml_attr(session.getElementsByTagName('Player')[0], 'state'),
- 'grandparent_title': self.get_xml_attr(session, 'grandparentTitle'),
- 'parent_title': self.get_xml_attr(session, 'parentTitle'),
- 'title': self.get_xml_attr(session, 'title'),
- 'rating_key': self.get_xml_attr(session, 'ratingKey'),
+ helpers.get_xml_attr(session.getElementsByTagName('User')[0], 'title')),
+ 'player': helpers.get_xml_attr(session.getElementsByTagName('Player')[0], 'platform'),
+ 'state': helpers.get_xml_attr(session.getElementsByTagName('Player')[0], 'state'),
+ 'grandparent_title': helpers.get_xml_attr(session, 'grandparentTitle'),
+ 'parent_title': helpers.get_xml_attr(session, 'parentTitle'),
+ 'title': helpers.get_xml_attr(session, 'title'),
+ 'rating_key': helpers.get_xml_attr(session, 'ratingKey'),
'audio_decision': audio_decision,
'audio_channels': audio_channels,
'audio_codec': audio_codec,
@@ -650,23 +552,23 @@ class PmsConnect(object):
'duration': duration,
'progress': progress,
'progress_percent': str(helpers.get_percent(progress, duration)),
- 'type': self.get_xml_attr(session, 'type'),
+ 'type': helpers.get_xml_attr(session, 'type'),
'indexes': use_indexes
}
- elif self.get_xml_attr(session, 'type') == 'movie':
- session_output = {'session_key': self.get_xml_attr(session, 'sessionKey'),
- 'art': self.get_xml_attr(session, 'art'),
+ elif helpers.get_xml_attr(session, 'type') == 'movie':
+ session_output = {'session_key': helpers.get_xml_attr(session, 'sessionKey'),
+ 'art': helpers.get_xml_attr(session, 'art'),
'thumb': thumb,
- 'parent_thumb': self.get_xml_attr(session, 'parentThumb'),
- 'user': self.get_xml_attr(session.getElementsByTagName('User')[0], 'title'),
+ 'parent_thumb': helpers.get_xml_attr(session, 'parentThumb'),
+ 'user': helpers.get_xml_attr(session.getElementsByTagName('User')[0], 'title'),
'friendly_name': plex_watch.get_user_friendly_name(
- self.get_xml_attr(session.getElementsByTagName('User')[0], 'title')),
- 'player': self.get_xml_attr(session.getElementsByTagName('Player')[0], 'platform'),
- 'state': self.get_xml_attr(session.getElementsByTagName('Player')[0], 'state'),
- 'grandparent_title': self.get_xml_attr(session, 'grandparentTitle'),
- 'parent_title': self.get_xml_attr(session, 'parentTitle'),
- 'title': self.get_xml_attr(session, 'title'),
- 'rating_key': self.get_xml_attr(session, 'ratingKey'),
+ helpers.get_xml_attr(session.getElementsByTagName('User')[0], 'title')),
+ 'player': helpers.get_xml_attr(session.getElementsByTagName('Player')[0], 'platform'),
+ 'state': helpers.get_xml_attr(session.getElementsByTagName('Player')[0], 'state'),
+ 'grandparent_title': helpers.get_xml_attr(session, 'grandparentTitle'),
+ 'parent_title': helpers.get_xml_attr(session, 'parentTitle'),
+ 'title': helpers.get_xml_attr(session, 'title'),
+ 'rating_key': helpers.get_xml_attr(session, 'ratingKey'),
'audio_decision': audio_decision,
'audio_channels': audio_channels,
'audio_codec': audio_codec,
@@ -677,23 +579,23 @@ class PmsConnect(object):
'duration': duration,
'progress': progress,
'progress_percent': str(helpers.get_percent(progress, duration)),
- 'type': self.get_xml_attr(session, 'type'),
+ 'type': helpers.get_xml_attr(session, 'type'),
'indexes': use_indexes
}
- elif self.get_xml_attr(session, 'type') == 'clip':
- session_output = {'session_key': self.get_xml_attr(session, 'sessionKey'),
- 'art': self.get_xml_attr(session, 'art'),
+ elif helpers.get_xml_attr(session, 'type') == 'clip':
+ session_output = {'session_key': helpers.get_xml_attr(session, 'sessionKey'),
+ 'art': helpers.get_xml_attr(session, 'art'),
'thumb': thumb,
- 'parent_thumb': self.get_xml_attr(session, 'parentThumb'),
- 'user': self.get_xml_attr(session.getElementsByTagName('User')[0], 'title'),
+ 'parent_thumb': helpers.get_xml_attr(session, 'parentThumb'),
+ 'user': helpers.get_xml_attr(session.getElementsByTagName('User')[0], 'title'),
'friendly_name': plex_watch.get_user_friendly_name(
- self.get_xml_attr(session.getElementsByTagName('User')[0], 'title')),
- 'player': self.get_xml_attr(session.getElementsByTagName('Player')[0], 'platform'),
- 'state': self.get_xml_attr(session.getElementsByTagName('Player')[0], 'state'),
- 'grandparent_title': self.get_xml_attr(session, 'grandparentTitle'),
- 'parent_title': self.get_xml_attr(session, 'parentTitle'),
- 'title': self.get_xml_attr(session, 'title'),
- 'rating_key': self.get_xml_attr(session, 'ratingKey'),
+ helpers.get_xml_attr(session.getElementsByTagName('User')[0], 'title')),
+ 'player': helpers.get_xml_attr(session.getElementsByTagName('Player')[0], 'platform'),
+ 'state': helpers.get_xml_attr(session.getElementsByTagName('Player')[0], 'state'),
+ 'grandparent_title': helpers.get_xml_attr(session, 'grandparentTitle'),
+ 'parent_title': helpers.get_xml_attr(session, 'parentTitle'),
+ 'title': helpers.get_xml_attr(session, 'title'),
+ 'rating_key': helpers.get_xml_attr(session, 'ratingKey'),
'audio_decision': audio_decision,
'audio_channels': audio_channels,
'audio_codec': audio_codec,
@@ -704,7 +606,7 @@ class PmsConnect(object):
'duration': duration,
'progress': progress,
'progress_percent': str(helpers.get_percent(progress, duration)),
- 'type': self.get_xml_attr(session, 'type'),
+ 'type': helpers.get_xml_attr(session, 'type'),
'indexes': 0
}
else:
@@ -738,15 +640,15 @@ class PmsConnect(object):
if a.getElementsByTagName('Video'):
result_data = a.getElementsByTagName('Video')
for result in result_data:
- episode_output = {'rating_key': self.get_xml_attr(result, 'ratingKey'),
- 'index': self.get_xml_attr(result, 'index'),
- 'title': self.get_xml_attr(result, 'title'),
- 'thumb': self.get_xml_attr(result, 'thumb')
+ episode_output = {'rating_key': helpers.get_xml_attr(result, 'ratingKey'),
+ 'index': helpers.get_xml_attr(result, 'index'),
+ 'title': helpers.get_xml_attr(result, 'title'),
+ 'thumb': helpers.get_xml_attr(result, 'thumb')
}
episode_list.append(episode_output)
- output = {'episode_count': self.get_xml_attr(xml_head[0], 'size'),
- 'title': self.get_xml_attr(xml_head[0], 'title2'),
+ output = {'episode_count': helpers.get_xml_attr(xml_head[0], 'size'),
+ 'title': helpers.get_xml_attr(xml_head[0], 'title2'),
'episode_list': episode_list
}
@@ -767,11 +669,11 @@ class PmsConnect(object):
server_info = []
for a in xml_head:
- output = {"name": self.get_xml_attr(a, 'name'),
- "machine_identifier": self.get_xml_attr(a, 'machineIdentifier'),
- "host": self.get_xml_attr(a, 'host'),
- "port": self.get_xml_attr(a, 'port'),
- "version": self.get_xml_attr(a, 'version')
+ output = {"name": helpers.get_xml_attr(a, 'name'),
+ "machine_identifier": helpers.get_xml_attr(a, 'machineIdentifier'),
+ "host": helpers.get_xml_attr(a, 'host'),
+ "port": helpers.get_xml_attr(a, 'port'),
+ "version": helpers.get_xml_attr(a, 'version')
}
server_info.append(output)
@@ -793,8 +695,8 @@ class PmsConnect(object):
server_identity = {}
for a in xml_head:
- server_identity = {"machine_identifier": self.get_xml_attr(a, 'machineIdentifier'),
- "version": self.get_xml_attr(a, 'version')
+ server_identity = {"machine_identifier": helpers.get_xml_attr(a, 'machineIdentifier'),
+ "version": helpers.get_xml_attr(a, 'version')
}
return server_identity
@@ -808,28 +710,19 @@ class PmsConnect(object):
height { the image height }
Output: array
"""
- def get_image(self, img, width='0', height='0'):
- if img != '':
- try:
- http_handler = HTTPConnection(self.host, self.port, timeout=10)
- if width != '0' and height != '0':
- image_path = '/photo/:/transcode?url=http://127.0.0.1:32400' + img + '&width=' + width + '&height=' + height
- else:
- image_path = '/photo/:/transcode?url=http://127.0.0.1:32400' + img
+ def get_image(self, img=None, width=None, height=None):
+ if img:
+ if width.isdigit() and height.isdigit():
+ uri = '/photo/:/transcode?url=http://127.0.0.1:32400' + img + '&width=' + width + '&height=' + height
+ else:
+ uri = '/photo/:/transcode?url=http://127.0.0.1:32400' + img
- http_handler.request("GET", image_path + '&X-Plex-Token=' + self.token)
- response = http_handler.getresponse()
- request_status = response.status
- request_content = response.read()
- request_content_type = response.getheader('content-type')
- except IOError, e:
- logger.warn(u"Failed to retrieve image. %s" % e)
- return None
+ request, content_type = self.request_handler.make_request(uri=uri,
+ proto=self.protocol,
+ request_type='GET',
+ return_type=True)
- if request_status == 200:
- return [request_content_type, request_content]
+ return [request, content_type]
else:
- logger.warn(u"Failed to retrieve image. Status code %r" % request_status)
+ logger.error("Image proxy queries but no input received.")
return None
-
- return None
diff --git a/plexpy/webserve.py b/plexpy/webserve.py
index e64fbf4f..1c9288fb 100644
--- a/plexpy/webserve.py
+++ b/plexpy/webserve.py
@@ -547,8 +547,8 @@ class WebInterface(object):
try:
pms_connect = pmsconnect.PmsConnect()
result = pms_connect.get_image(img, width, height)
- cherrypy.response.headers['Content-type'] = result[0]
- return result[1]
+ cherrypy.response.headers['Content-type'] = result[1]
+ return result[0]
except:
logger.warn('Image proxy queried but errors occured.')
if fallback == 'poster':