diff --git a/data/interfaces/default/home_stats.html b/data/interfaces/default/home_stats.html index 8f548605..d30b33d9 100644 --- a/data/interfaces/default/home_stats.html +++ b/data/interfaces/default/home_stats.html @@ -16,7 +16,7 @@
-

Most Popular TV

+

Most Watched TV

${a['rows'][0]['orig_title']}
diff --git a/data/interfaces/default/info.html b/data/interfaces/default/info.html index b8eabe23..6d92d34b 100644 --- a/data/interfaces/default/info.html +++ b/data/interfaces/default/info.html @@ -56,25 +56,19 @@ % else: Directed by unknown % endif - % elif metadata['type'] == 'show': + % elif metadata['type'] == 'show' or metadata['type'] == 'season': Studio ${metadata['studio']} % endif
- % if metadata['type'] == 'episode' or metadata['type'] == 'movie' or metadata['type'] == 'show': - Runtime ${metadata['duration']} mins - % endif + Runtime ${metadata['duration']} mins
- % if metadata['type'] == 'episode' or metadata['type'] == 'movie' or metadata['type'] == 'show': - Rated ${metadata['contentRating']} - % endif + Rated ${metadata['contentRating']}
- % if metadata['type'] == 'episode' or metadata['type'] == 'movie' or metadata['type'] == 'show': -

${metadata['summary']}

- % endif +

${metadata['summary']}

@@ -171,6 +165,14 @@ + % elif metadata['type'] == 'season': +
+
+

Episode list for ${metadata['title']}

+
+
+
+
% endif @@ -220,5 +222,18 @@ }); %endif + % if metadata['type'] == 'season': + + % endif % endif diff --git a/data/interfaces/default/info_episode_list.html b/data/interfaces/default/info_episode_list.html new file mode 100644 index 00000000..eb24ed16 --- /dev/null +++ b/data/interfaces/default/info_episode_list.html @@ -0,0 +1,33 @@ +% if episode_list != None: +% if episode_list['episode_count'] > 0: +
+ +
+% endif +% endif + diff --git a/plexpy/pmsconnect.py b/plexpy/pmsconnect.py index 93594109..43362aa8 100644 --- a/plexpy/pmsconnect.py +++ b/plexpy/pmsconnect.py @@ -155,6 +155,40 @@ class PmsConnect(object): return output + """ + Return list of episodes in requested season. + + Parameters required: rating_key { ratingKey of parent } + Optional parameters: output_format { dict, json } + + Output: array + """ + def get_episode_list(self, rating_key='', output_format=''): + url_command = '/library/metadata/' + rating_key + '/children' + 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. @@ -350,6 +384,9 @@ class PmsConnect(object): } metadata_list = {'metadata': metadata} elif metadata_type == 'season': + parent_rating_key = self.get_xml_attr(metadata_main, 'parentRatingKey') + show_details = self.get_metadata_details(parent_rating_key) + logger.debug(u"show_details = %r" % show_details) metadata = {'type': metadata_type, 'ratingKey': self.get_xml_attr(metadata_main, 'ratingKey'), 'parentTitle': self.get_xml_attr(metadata_main, 'parentTitle'), @@ -357,6 +394,10 @@ class PmsConnect(object): 'title': self.get_xml_attr(metadata_main, 'title'), 'thumb': self.get_xml_attr(metadata_main, 'thumb'), 'art': self.get_xml_attr(metadata_main, 'art'), + 'summary': show_details['metadata']['summary'], + 'studio': show_details['metadata']['studio'], + 'duration': show_details['metadata']['duration'], + 'contentRating': show_details['metadata']['contentRating'] } metadata_list = {'metadata': metadata} else: @@ -367,7 +408,8 @@ class PmsConnect(object): """ Validate xml keys to make sure they exist and return their attribute value, return blank value is none found """ - def get_xml_attr(self, xml_key, attribute, return_bool=False, default_return=''): + @staticmethod + def get_xml_attr(xml_key, attribute, return_bool=False, default_return=''): if xml_key.getAttribute(attribute): if return_bool: return True @@ -548,6 +590,55 @@ class PmsConnect(object): return session_output + """ + Return processed and validated episode list. + + Output: array + """ + def get_season_children(self, rating_key=''): + episode_data = self.get_episode_list(rating_key) + episode_list = [] + + try: + xml_parse = minidom.parseString(episode_data) + except Exception, e: + logger.warn("Error parsing XML for Plex session data: %s" % e) + return None + except: + logger.warn("Error parsing XML for Plex session data.") + return None + + xml_head = xml_parse.getElementsByTagName('MediaContainer') + if not xml_head: + logger.warn("Error parsing XML for Plex session data.") + return None + + for a in xml_head: + if a.getAttribute('size'): + if a.getAttribute('size') == '0': + logger.debug(u"No episode data.") + episode_list = {'episode_count': '0', + 'episode_list': [] + } + return episode_list + + if a.getElementsByTagName('Video'): + result_data = a.getElementsByTagName('Video') + for result in result_data: + episode_output = {'ratingKey': 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_list.append(episode_output) + + output = {'episode_count': self.get_xml_attr(xml_head[0], 'size'), + 'title': self.get_xml_attr(xml_head[0], 'title2'), + 'episode_list': episode_list + } + + return output + """ Return image data as array. Array contains the image content type and image binary diff --git a/plexpy/webserve.py b/plexpy/webserve.py index b231f4de..e5edce27 100644 --- a/plexpy/webserve.py +++ b/plexpy/webserve.py @@ -575,6 +575,18 @@ class WebInterface(object): return serve_template(templatename="user_platform_stats.html", platform_stats=None, title="Platform Stats") logger.warn('Unable to retrieve data.') + @cherrypy.expose + def get_children(self, rating_key='', **kwargs): + + pms_connect = pmsconnect.PmsConnect() + result = pms_connect.get_season_children(rating_key) + + if result: + return serve_template(templatename="info_episode_list.html", episode_list=result, title="Episode List") + else: + return serve_template(templatename="info_episode_list.html", episode_list=None, title="Episode List") + logger.warn('Unable to retrieve data.') + @cherrypy.expose def get_metadata_json(self, rating_key='', **kwargs): @@ -611,6 +623,18 @@ class WebInterface(object): else: logger.warn('Unable to retrieve data.') + @cherrypy.expose + def get_episode_list_json(self, rating_key='', **kwargs): + + pms_connect = pmsconnect.PmsConnect() + result = pms_connect.get_episode_list(rating_key, 'json') + + if result: + cherrypy.response.headers['Content-type'] = 'application/json' + return result + else: + logger.warn('Unable to retrieve data.') + @cherrypy.expose def get_stream(self, row_id='', **kwargs):