diff --git a/data/interfaces/default/config.html b/data/interfaces/default/config.html
index 91af2de7..1e81e8ba 100644
--- a/data/interfaces/default/config.html
+++ b/data/interfaces/default/config.html
@@ -183,6 +183,13 @@
Enable Grouping
@@ -140,6 +142,11 @@ DOCUMENTATION :: END
% endfor
+
% else:
Nothing is currently being watched.
% endif
diff --git a/plexpy/config.py b/plexpy/config.py
index 55b82d07..b677422b 100644
--- a/plexpy/config.py
+++ b/plexpy/config.py
@@ -27,6 +27,7 @@ _CONFIG_DEFINITIONS = {
'PMS_PASSWORD': (str, 'PMS', ''),
'PMS_TOKEN': (str, 'PMS', ''),
'PMS_USERNAME': (str, 'PMS', ''),
+ 'PMS_USE_BIF': (int, 'PMS', 0),
'TIME_FORMAT': (str, 'General', 'HH:mm'),
'API_ENABLED': (int, 'General', 0),
'API_KEY': (str, 'General', ''),
diff --git a/plexpy/plextv.py b/plexpy/plextv.py
index ba02c143..10cd0513 100644
--- a/plexpy/plextv.py
+++ b/plexpy/plextv.py
@@ -39,10 +39,11 @@ class PlexTV(object):
def __init__(self, username='', password=''):
self.username = username
self.password = password
+ self.url = 'plex.tv'
def get_plex_auth(self):
- http_handler = HTTPSConnection("plex.tv")
+ http_handler = HTTPSConnection(self.url)
base64string = base64.encodestring('%s:%s' % (self.username, self.password)).replace('\n', '')
http_handler.request("POST",
@@ -109,4 +110,108 @@ class PlexTV(object):
return user_data
else:
- return False
\ No newline at end of file
+ return False
+
+ def get_plextv_friends(self, output_format=''):
+ url_command = '/api/users'
+ http_handler = HTTPSConnection(self.url, timeout=10)
+
+ 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
+
+ def get_plextv_user_details(self, output_format=''):
+ url_command = '/users/account'
+ http_handler = HTTPSConnection(self.url, timeout=10)
+
+ 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
+
+ def get_plextv_server_list(self, output_format=''):
+ url_command = '/pms/servers.xml'
+ http_handler = HTTPSConnection(self.url, timeout=10)
+
+ 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
+
+ def get_plextv_sync_lists(self, machine_id='', output_format=''):
+ url_command = '/servers/' + machine_id + '/sync_lists'
+ http_handler = HTTPSConnection(self.url, timeout=10)
+
+ 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
\ No newline at end of file
diff --git a/plexpy/pmsconnect.py b/plexpy/pmsconnect.py
index c065430b..01b88bad 100644
--- a/plexpy/pmsconnect.py
+++ b/plexpy/pmsconnect.py
@@ -179,6 +179,39 @@ class PmsConnect(object):
return output
+ """
+ Return list of local servers.
+
+ Optional parameters: output_format { dict, json }
+
+ Output: array
+ """
+ def get_server_list(self, output_format=''):
+ url_command = '/servers'
+ http_handler = HTTPConnection(self.host, self.port, timeout=10)
+
+ try:
+ http_handler.request("GET", url_command + '?X-Plex-Token=' + self.token)
+ response = http_handler.getresponse()
+ request_status = response.status
+ request_content = response.read()
+ except IOError, e:
+ logger.warn(u"Failed to access metadata. %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 metadata. Status code %r" % request_status)
+ return None
+
+ return output
+
"""
Return processed and validated list of recently added items.
@@ -522,10 +555,29 @@ class PmsConnect(object):
duration = self.get_xml_attr(media_info, 'duration')
progress = self.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')
+ if indexes == 'sd':
+ bif_thumb = '/library/parts/' + part_id + '/indexes/sd/' + progress
+ else:
+ bif_thumb = ''
+ else:
+ indexes = ''
+ bif_thumb = ''
+
+ if plexpy.CONFIG.PMS_USE_BIF and indexes == 'sd':
+ thumb = bif_thumb
+ use_indexes = 1
+ else:
+ thumb = self.get_xml_attr(session, 'thumb')
+ use_indexes = 0
+
if self.get_xml_attr(session, 'type') == 'episode':
session_output = {'sessionKey': self.get_xml_attr(session, 'sessionKey'),
'art': self.get_xml_attr(session, 'art'),
- 'thumb': self.get_xml_attr(session, 'thumb'),
+ 'thumb': thumb,
'user': 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'),
@@ -542,12 +594,13 @@ class PmsConnect(object):
'duration': duration,
'progress': progress,
'progressPercent': str(helpers.get_percent(progress, duration)),
- 'type': self.get_xml_attr(session, 'type')
+ 'type': self.get_xml_attr(session, 'type'),
+ 'indexes': use_indexes
}
elif self.get_xml_attr(session, 'type') == 'movie':
session_output = {'sessionKey': self.get_xml_attr(session, 'sessionKey'),
'art': self.get_xml_attr(session, 'art'),
- 'thumb': self.get_xml_attr(session, 'thumb'),
+ 'thumb': thumb,
'user': 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'),
@@ -563,7 +616,8 @@ class PmsConnect(object):
'duration': duration,
'progress': progress,
'progressPercent': str(helpers.get_percent(progress, duration)),
- 'type': self.get_xml_attr(session, 'type')
+ 'type': self.get_xml_attr(session, 'type'),
+ 'indexes': use_indexes
}
else:
logger.warn(u"No known stream types found in session list.")
@@ -636,6 +690,7 @@ class PmsConnect(object):
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
+
http_handler.request("GET", image_path + '&X-Plex-Token=' + self.token)
response = http_handler.getresponse()
request_status = response.status
diff --git a/plexpy/webserve.py b/plexpy/webserve.py
index 80ce5f82..45f3245a 100644
--- a/plexpy/webserve.py
+++ b/plexpy/webserve.py
@@ -273,6 +273,7 @@ class WebInterface(object):
"pms_ip": plexpy.CONFIG.PMS_IP,
"pms_port": plexpy.CONFIG.PMS_PORT,
"pms_token": plexpy.CONFIG.PMS_TOKEN,
+ "pms_use_bif": checked(plexpy.CONFIG.PMS_USE_BIF),
"plexwatch_database": plexpy.CONFIG.PLEXWATCH_DATABASE,
"date_format": plexpy.CONFIG.DATE_FORMAT,
"time_format": plexpy.CONFIG.TIME_FORMAT,
@@ -294,7 +295,7 @@ class WebInterface(object):
"synoindex_enabled", "pushover_enabled", "pushbullet_enabled",
"subsonic_enabled", "twitter_enabled", "osx_notify_enabled",
"boxcar_enabled", "mpc_enabled", "email_enabled", "email_tls",
- "grouping_global_history", "grouping_user_history", "grouping_charts"
+ "grouping_global_history", "grouping_user_history", "grouping_charts", "pms_use_bif"
]
for checked_config in checked_configs:
if checked_config not in kwargs:
@@ -733,3 +734,63 @@ class WebInterface(object):
return json.dumps(result)
else:
logger.warn('Unable to retrieve data.')
+
+ @cherrypy.expose
+ def get_friends_list(self, **kwargs):
+
+ plex_tv = plextv.PlexTV()
+ result = plex_tv.get_plextv_friends('json')
+
+ if result:
+ cherrypy.response.headers['Content-type'] = 'application/json'
+ return result
+ else:
+ logger.warn('Unable to retrieve data.')
+
+ @cherrypy.expose
+ def get_user_details(self, **kwargs):
+
+ plex_tv = plextv.PlexTV()
+ result = plex_tv.get_plextv_user_details('json')
+
+ if result:
+ cherrypy.response.headers['Content-type'] = 'application/json'
+ return result
+ else:
+ logger.warn('Unable to retrieve data.')
+
+ @cherrypy.expose
+ def get_server_list(self, **kwargs):
+
+ plex_tv = plextv.PlexTV()
+ result = plex_tv.get_plextv_server_list('json')
+
+ if result:
+ cherrypy.response.headers['Content-type'] = 'application/json'
+ return result
+ else:
+ logger.warn('Unable to retrieve data.')
+
+ @cherrypy.expose
+ def get_sync_lists(self, machine_id='', **kwargs):
+
+ plex_tv = plextv.PlexTV()
+ result = plex_tv.get_plextv_sync_lists(machine_id=machine_id, output_format='json')
+
+ if result:
+ cherrypy.response.headers['Content-type'] = 'application/json'
+ return result
+ else:
+ logger.warn('Unable to retrieve data.')
+
+ @cherrypy.expose
+ def get_servers(self, **kwargs):
+
+ pms_connect = pmsconnect.PmsConnect()
+ result = pms_connect.get_server_list(output_format='json')
+
+ if result:
+ cherrypy.response.headers['Content-type'] = 'application/json'
+ return result
+ else:
+ logger.warn('Unable to retrieve data.')