Add search functions

This commit is contained in:
Jonathan Wong 2015-09-24 18:42:56 -07:00
parent 9738bdcb55
commit d36de5a535
2 changed files with 128 additions and 0 deletions

View file

@ -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

View file

@ -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")