Update to use Plex hub search

This commit is contained in:
JonnyWong16 2017-12-09 23:59:25 -08:00
parent 1b5e5f37d0
commit 1787fff8c3
3 changed files with 50 additions and 71 deletions

View file

@ -29,13 +29,16 @@
<%def name="javascriptIncludes()">
<script>
$('#search_button').removeClass('btn-inactive');
$('#query').val("${query.replace('"','\\"')}").css({ right: '0', width: '250px' }).addClass('active');
$('#query').val("${query.replace('"','\\"') | n}").css({ right: '0', width: '250px' }).addClass('active');
$.ajax({
url: 'get_search_results_children',
type: "GET",
async: true,
data: {'query': "${query.replace('"','\\"')}"},
data: {
query: "${query.replace('"','\\"') | n}",
limit: 30
},
complete: function (xhr, status) {
$("#search-results-list").html(xhr.responseText);
}

View file

@ -372,7 +372,7 @@ class PmsConnect(object):
return request
def get_sync_item(self, sync_id=None, output_format=''):
def get_sync_item(self, sync_id='', output_format=''):
"""
Return sync item details.
@ -405,7 +405,7 @@ class PmsConnect(object):
return request
def get_search(self, query='', track='', output_format=''):
def get_search(self, query='', limit='', output_format=''):
"""
Return search results.
@ -413,7 +413,7 @@ class PmsConnect(object):
Output: array
"""
uri = '/search?query=' + urllib.quote(query.encode('utf8')) + track
uri = '/hubs/search?query=' + urllib.quote(query.encode('utf8')) + '&limit=' + limit
request = self.request_handler.make_request(uri=uri,
proto=self.protocol,
request_type='GET',
@ -2086,30 +2086,20 @@ class PmsConnect(object):
else:
logger.error(u"PlexPy Pmsconnect :: Image proxy queried but no input received.")
def get_search_results(self, query=''):
def get_search_results(self, query='', limit=''):
"""
Return processed list of search results.
Output: array
"""
search_results = self.get_search(query=query, output_format='xml')
search_results_tracks = self.get_search(query=query, track='&type=10', output_format='xml')
search_results = self.get_search(query=query, limit=limit, 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
xml_head = search_results.getElementsByTagName('MediaContainer')
except Exception as e:
logger.warn(u"PlexPy Pmsconnect :: Unable to parse XML for get_search_result_details: %s." % e)
logger.warn(u"PlexPy Pmsconnect :: Unable to parse XML for get_search_result: %s." % e)
return []
search_results_count = 0
search_results_list = {'movie': [],
'show': [],
'season': [],
@ -2119,62 +2109,45 @@ class PmsConnect(object):
'track': []
}
totalSize = 0
for a in xml_head:
if a.getAttribute('size'):
totalSize += int(a.getAttribute('size'))
if totalSize == 0:
logger.debug(u"PlexPy Pmsconnect :: No search results.")
search_results_list = {'results_count': search_results_count,
'results_list': []
}
return search_results_list
hubs = a.getElementsByTagName('Hub')
for a in xml_head:
if a.getElementsByTagName('Video'):
result_data = a.getElementsByTagName('Video')
for h in hubs:
if helpers.get_xml_attr(h, 'size') == '0' or \
helpers.get_xml_attr(h, 'type') not in search_results_list.keys():
continue
if h.getElementsByTagName('Video'):
result_data = h.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['media_type'] == 'movie':
search_results_list['movie'].append(metadata)
elif metadata['media_type'] == 'episode':
search_results_list['episode'].append(metadata)
search_results_count += 1
search_results_list[metadata['media_type']].append(metadata)
if a.getElementsByTagName('Directory'):
result_data = a.getElementsByTagName('Directory')
if h.getElementsByTagName('Directory'):
result_data = h.getElementsByTagName('Directory')
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[metadata['media_type']].append(metadata)
if metadata['media_type'] == 'show':
search_results_list['show'].append(metadata)
show_seasons = self.get_item_children(rating_key=metadata['rating_key'])
if show_seasons['children_count'] != '0':
for season in show_seasons['children_list']:
if season['rating_key']:
rating_key = season['rating_key']
metadata = self.get_metadata_details(rating_key=rating_key)
metadata = self.get_metadata_details(rating_key=season['rating_key'])
search_results_list['season'].append(metadata)
search_results_count += 1
elif metadata['media_type'] == 'artist':
search_results_list['artist'].append(metadata)
elif metadata['media_type'] == 'album':
search_results_list['album'].append(metadata)
search_results_count += 1
if a.getElementsByTagName('Track'):
result_data = a.getElementsByTagName('Track')
if h.getElementsByTagName('Track'):
result_data = h.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['track'].append(metadata)
search_results_count += 1
search_results_list[metadata['media_type']].append(metadata)
output = {'results_count': search_results_count,
'results_list': {k: v for k, v in search_results_list.iteritems()}
output = {'results_count': sum(len(s) for s in search_results_list.items()),
'results_list': search_results_list
}
return output

View file

@ -3920,13 +3920,16 @@ class WebInterface(object):
@cherrypy.tools.json_out()
@requireAuth(member_of("admin"))
@addtoapi('search')
def search_results(self, query, **kwargs):
def search_results(self, query='', limit='', **kwargs):
""" Get search results from the PMS.
```
Required parameters:
query (str): The query string to search for
Optional parameters:
limit (int): The maximum number of items to return per media type
Returns:
json:
{"results_count": 69,
@ -3955,10 +3958,10 @@ class WebInterface(object):
@cherrypy.expose
@requireAuth()
def get_search_results_children(self, query, media_type=None, season_index=None, **kwargs):
def get_search_results_children(self, query='', limit='', media_type=None, season_index=None, **kwargs):
pms_connect = pmsconnect.PmsConnect()
result = pms_connect.get_search_results(query)
result = pms_connect.get_search_results(query=query, limit=limit)
if media_type:
result['results_list'] = {media_type: result['results_list'][media_type]}