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()"> <%def name="javascriptIncludes()">
<script> <script>
$('#search_button').removeClass('btn-inactive'); $('#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({ $.ajax({
url: 'get_search_results_children', url: 'get_search_results_children',
type: "GET", type: "GET",
async: true, async: true,
data: {'query': "${query.replace('"','\\"')}"}, data: {
query: "${query.replace('"','\\"') | n}",
limit: 30
},
complete: function (xhr, status) { complete: function (xhr, status) {
$("#search-results-list").html(xhr.responseText); $("#search-results-list").html(xhr.responseText);
} }

View file

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

View file

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