mirror of
https://github.com/Tautulli/Tautulli.git
synced 2025-07-10 23:42:37 -07:00
Update to use Plex hub search
This commit is contained in:
parent
1b5e5f37d0
commit
1787fff8c3
3 changed files with 50 additions and 71 deletions
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
|
@ -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():
|
||||||
for result in result_data:
|
continue
|
||||||
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
|
|
||||||
|
|
||||||
if a.getElementsByTagName('Directory'):
|
if h.getElementsByTagName('Video'):
|
||||||
result_data = a.getElementsByTagName('Directory')
|
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'] == 'show':
|
search_results_list[metadata['media_type']].append(metadata)
|
||||||
search_results_list['show'].append(metadata)
|
|
||||||
|
|
||||||
show_seasons = self.get_item_children(rating_key=metadata['rating_key'])
|
if h.getElementsByTagName('Directory'):
|
||||||
if show_seasons['children_count'] != '0':
|
result_data = h.getElementsByTagName('Directory')
|
||||||
for season in show_seasons['children_list']:
|
for result in result_data:
|
||||||
if season['rating_key']:
|
rating_key = helpers.get_xml_attr(result, 'ratingKey')
|
||||||
rating_key = season['rating_key']
|
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)
|
||||||
search_results_list['season'].append(metadata)
|
|
||||||
search_results_count += 1
|
|
||||||
|
|
||||||
elif metadata['media_type'] == 'artist':
|
if metadata['media_type'] == 'show':
|
||||||
search_results_list['artist'].append(metadata)
|
show_seasons = self.get_item_children(rating_key=metadata['rating_key'])
|
||||||
elif metadata['media_type'] == 'album':
|
if show_seasons['children_count'] != '0':
|
||||||
search_results_list['album'].append(metadata)
|
for season in show_seasons['children_list']:
|
||||||
search_results_count += 1
|
if season['rating_key']:
|
||||||
|
metadata = self.get_metadata_details(rating_key=season['rating_key'])
|
||||||
|
search_results_list['season'].append(metadata)
|
||||||
|
|
||||||
if a.getElementsByTagName('Track'):
|
if h.getElementsByTagName('Track'):
|
||||||
result_data = a.getElementsByTagName('Track')
|
result_data = h.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
|
||||||
|
|
|
@ -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]}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue