diff --git a/plexpy/pmsconnect.py b/plexpy/pmsconnect.py index 3b58adb5..e7701788 100644 --- a/plexpy/pmsconnect.py +++ b/plexpy/pmsconnect.py @@ -17,6 +17,7 @@ from plexpy import logger, helpers, users, http_handler from urlparse import urlparse import plexpy +import urllib class PmsConnect(object): @@ -219,6 +220,22 @@ class PmsConnect(object): return request + """ + Return search results. + + Optional parameters: output_format { dict, json } + + Output: array + """ + def get_search(self, query='', track='', output_format=''): + uri = '/search?query=' + urllib.quote_plus(query) + track + request = self.request_handler.make_request(uri=uri, + proto=self.protocol, + request_type='GET', + output_format=output_format) + + return request + """ Return processed and validated list of recently added items. @@ -1340,3 +1357,88 @@ class PmsConnect(object): else: logger.error("Image proxy queries but no input received.") return None + + """ + Return processed list of search results. + + Output: array + """ + def get_search_results(self, query=''): + search_results = self.get_search(query=query, output_format='xml') + search_results_tracks = self.get_search(query=query, track='&type=10', output_format='xml') + + xml_head = [] + try: + try: + xml_head += search_results.getElementsByTagName('MediaContainer') + except: + pass + try: + xml_head += search_results_tracks.getElementsByTagName('MediaContainer') + except: + pass + except: + logger.warn("Unable to parse XML for get_search_result_details.") + return [] + + search_results_count = 0 + search_results_list = {'movies': [], + 'shows': [], + 'seasons': [], + 'episodes': [], + 'artists': [], + 'albums': [], + 'tracks': [] + } + + totalSize = 0 + for a in xml_head: + if a.getAttribute('size'): + totalSize += int(a.getAttribute('size')) + if totalSize == 0: + logger.debug(u"No search results.") + search_results_list = {'results_count': search_results_count, + 'results_list': [] + } + return search_results_list + + for a in xml_head: + if a.getElementsByTagName('Video'): + result_data = a.getElementsByTagName('Video') + for result in result_data: + rating_key = helpers.get_xml_attr(result, 'ratingKey') + metadata = self.get_metadata_details(rating_key=rating_key) + if metadata['metadata']['type'] == 'movie': + search_results_list['movies'].append(metadata['metadata']) + elif metadata['metadata']['type'] == 'episode': + search_results_list['episodes'].append(metadata['metadata']) + search_results_count += 1 + + if a.getElementsByTagName('Directory'): + result_data = a.getElementsByTagName('Directory') + for result in result_data: + rating_key = helpers.get_xml_attr(result, 'ratingKey') + metadata = self.get_metadata_details(rating_key=rating_key) + if metadata['metadata']['type'] == 'show': + search_results_list['shows'].append(metadata['metadata']) + elif metadata['metadata']['type'] == 'season': + search_results_list['seasons'].append(metadata['metadata']) + elif metadata['metadata']['type'] == 'artist': + search_results_list['artists'].append(metadata['metadata']) + elif metadata['metadata']['type'] == 'album': + search_results_list['albums'].append(metadata['metadata']) + search_results_count += 1 + + if a.getElementsByTagName('Track'): + result_data = a.getElementsByTagName('Track') + for result in result_data: + rating_key = helpers.get_xml_attr(result, 'ratingKey') + metadata = self.get_metadata_details(rating_key=rating_key) + search_results_list['tracks'].append(metadata['metadata']) + search_results_count += 1 + + output = {'results_count': search_results_count, + 'results_list': search_results_list + } + + return output \ No newline at end of file diff --git a/plexpy/webserve.py b/plexpy/webserve.py index 519577c7..d082e85f 100644 --- a/plexpy/webserve.py +++ b/plexpy/webserve.py @@ -1323,3 +1323,29 @@ class WebInterface(object): cherrypy.response.headers['Content-type'] = 'application/json' return json.dumps({'message': 'no data received'}) + @cherrypy.expose + def search_results(self, query, **kwargs): + + pms_connect = pmsconnect.PmsConnect() + result = pms_connect.get_search_results(query) + + if result: + cherrypy.response.headers['Content-type'] = 'application/json' + return json.dumps(result) + else: + logger.warn('Unable to retrieve data.') + + @cherrypy.expose + def get_search_results_children(self, query, media_type=None, **kwargs): + + pms_connect = pmsconnect.PmsConnect() + result = pms_connect.get_search_results(query) + + if media_type: + result['results_list'] = {media_type: result['results_list'][media_type]} + + if result: + return serve_template(templatename="info_search_results_list.html", data=result, title="Search Result List") + else: + logger.warn('Unable to retrieve data.') + return serve_template(templatename="info_search_results_list.html", data=None, title="Search Result List")