mirror of
https://github.com/Tautulli/Tautulli.git
synced 2025-07-13 00:32:58 -07:00
Add recently added to home screen.
This commit is contained in:
parent
af028cb1d9
commit
473ea7513c
4 changed files with 195 additions and 1 deletions
|
@ -26,11 +26,22 @@
|
|||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class='row-fluid'>
|
||||
<div class='wellbg'>
|
||||
<div class='wellheader'>
|
||||
<div class='dashboard-wellheader'>
|
||||
<h3>Recently Added</h3>
|
||||
</div>
|
||||
</div>
|
||||
<div id='recentlyAdded'><div id='recently-added-spinner' class='spinner'></div></div>
|
||||
</div>
|
||||
</div>
|
||||
<footer></footer>
|
||||
</div>
|
||||
</%def>
|
||||
|
||||
<%def name="javascriptIncludes()">
|
||||
<script src="interfaces/default/js/moment-with-locale.js"></script>
|
||||
<script>
|
||||
function currentActivity() {
|
||||
$.ajax({
|
||||
|
@ -58,6 +69,32 @@
|
|||
currentActivityHeader();
|
||||
setInterval(currentActivityHeader, 15000);
|
||||
|
||||
function recentlyAdded() {
|
||||
var widthVal = $('body').find(".container-fluid").width();
|
||||
var tmp = widthVal / 182;
|
||||
|
||||
if (tmp > 0) {
|
||||
containerSize = parseInt(tmp);
|
||||
} else {
|
||||
containerSize = 1;
|
||||
}
|
||||
|
||||
$.ajax({
|
||||
url: 'get_recently_added',
|
||||
type: "GET",
|
||||
async: true,
|
||||
data: { count : containerSize },
|
||||
complete: function(xhr, status) {
|
||||
$("#recentlyAdded").html(xhr.responseText);
|
||||
}
|
||||
});
|
||||
}
|
||||
$(document).ready(function () {
|
||||
recentlyAdded();
|
||||
$(window).resize(function() {
|
||||
recentlyAdded();
|
||||
});
|
||||
});
|
||||
</script>
|
||||
|
||||
</%def>
|
||||
|
|
36
data/interfaces/default/recently_added.html
Normal file
36
data/interfaces/default/recently_added.html
Normal file
|
@ -0,0 +1,36 @@
|
|||
% if recently_added != None:
|
||||
<div class="dashboard-recent-media-row">
|
||||
<ul class="dashboard-recent-media">
|
||||
% for item in recently_added:
|
||||
<div class="dashboard-recent-media-instance">
|
||||
<li>
|
||||
<div class="poster">
|
||||
<div class="poster-face">
|
||||
<a href="info?rating_key=${item['ratingKey']}">
|
||||
% if item['thumb'] != '':
|
||||
<img src="pms_image_proxy?img=${item['thumb']}&width=153&height=225" class="poster-face">
|
||||
% else:
|
||||
<img src="interfaces/default/images/poster.png" class="poster-face">
|
||||
% endif
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="dashboard-recent-media-metacontainer">
|
||||
% if item['type'] == 'season':
|
||||
<h3>${item['title']}</h3>
|
||||
% elif item['type'] == 'movie':
|
||||
<h3>${item['title']} (${item['year']})</h3>
|
||||
% endif
|
||||
<h4><span id="addedAt-${item['ratingKey']}">${item['addedAt']}</span></h4>
|
||||
</div>
|
||||
</li>
|
||||
</div>
|
||||
<script>
|
||||
$('#addedAt-${item['ratingKey']}').html('Added ' + moment(${item['addedAt']}, "X").fromNow())
|
||||
</script>
|
||||
% endfor
|
||||
</ul>
|
||||
</div>
|
||||
% else:
|
||||
<h4>No recently added items.</h4>
|
||||
% endif
|
|
@ -105,6 +105,100 @@ class PmsConnect(object):
|
|||
|
||||
return output
|
||||
|
||||
"""
|
||||
Return list of recently added items.
|
||||
|
||||
Parameters required: count { number of results to return }
|
||||
Optional parameters: output_format { dict, json }
|
||||
|
||||
Output: array
|
||||
"""
|
||||
def get_recently_added(self, count='0', output_format=''):
|
||||
url_command = '/library/recentlyAdded?X-Plex-Container-Start=0&X-Plex-Container-Size=' + count
|
||||
http_handler = HTTPConnection(self.host, self.port, timeout=10)
|
||||
|
||||
http_handler.request("GET", url_command + '&X-Plex-Token=' + self.token)
|
||||
response = http_handler.getresponse()
|
||||
request_status = response.status
|
||||
request_content = response.read()
|
||||
|
||||
if output_format == 'dict':
|
||||
output = helpers.convert_xml_to_dict(request_content)
|
||||
elif output_format == 'json':
|
||||
output = helpers.convert_xml_to_json(request_content)
|
||||
else:
|
||||
output = request_content
|
||||
|
||||
return output
|
||||
|
||||
"""
|
||||
Return processed and validated list of recently added items.
|
||||
|
||||
Parameters required: count { number of results to return }
|
||||
|
||||
Output: array
|
||||
"""
|
||||
def get_recently_added_details(self, count='0'):
|
||||
recent = self.get_recently_added(count)
|
||||
recents_list = []
|
||||
|
||||
try:
|
||||
xml_parse = minidom.parseString(recent)
|
||||
except Exception, e:
|
||||
logger.warn("Error parsing XML for Plex recently added: %s" % e)
|
||||
return None
|
||||
except:
|
||||
logger.warn("Error parsing XML for Plex recently added.")
|
||||
return None
|
||||
|
||||
xml_head = xml_parse.getElementsByTagName('MediaContainer')
|
||||
if not xml_head:
|
||||
logger.warn("Error parsing XML for Plex recently added.")
|
||||
return None
|
||||
|
||||
for a in xml_head:
|
||||
if a.getAttribute('size'):
|
||||
if a.getAttribute('size') == '0':
|
||||
output = {'recently_added': None}
|
||||
return output
|
||||
|
||||
if a.getElementsByTagName('Directory'):
|
||||
recents_main = a.getElementsByTagName('Directory')
|
||||
for item in recents_main:
|
||||
recent_type = self.get_xml_attr(item, 'type')
|
||||
|
||||
if recent_type == 'season':
|
||||
recent_items = {'type': recent_type,
|
||||
'ratingKey': self.get_xml_attr(item, 'ratingKey'),
|
||||
'title': self.get_xml_attr(item, 'title'),
|
||||
'thumb': self.get_xml_attr(item, 'thumb'),
|
||||
'addedAt': self.get_xml_attr(item, 'addedAt')
|
||||
}
|
||||
recents_list.append(recent_items)
|
||||
else:
|
||||
recent_items = {}
|
||||
recents_list.append(recent_items)
|
||||
if a.getElementsByTagName('Video'):
|
||||
recents_main = a.getElementsByTagName('Video')
|
||||
for item in recents_main:
|
||||
recent_type = self.get_xml_attr(item, 'type')
|
||||
|
||||
if recent_type == 'movie':
|
||||
recent_items = {'type': recent_type,
|
||||
'ratingKey': self.get_xml_attr(item, 'ratingKey'),
|
||||
'title': self.get_xml_attr(item, 'title'),
|
||||
'year': self.get_xml_attr(item, 'year'),
|
||||
'thumb': self.get_xml_attr(item, 'thumb'),
|
||||
'addedAt': self.get_xml_attr(item, 'addedAt')
|
||||
}
|
||||
recents_list.append(recent_items)
|
||||
else:
|
||||
recent_items = {}
|
||||
recents_list.append(recent_items)
|
||||
|
||||
output = {'recently_added': recents_list}
|
||||
return output
|
||||
|
||||
"""
|
||||
Return processed and validated metadata list for requested item.
|
||||
|
||||
|
|
|
@ -678,6 +678,21 @@ class WebInterface(object):
|
|||
return serve_template(templatename="current_activity_header.html", activity=None)
|
||||
logger.warn('Unable to retrieve data.')
|
||||
|
||||
@cherrypy.expose
|
||||
def get_recently_added(self, count='0', **kwargs):
|
||||
|
||||
try:
|
||||
pms_connect = pmsconnect.PmsConnect()
|
||||
result = pms_connect.get_recently_added_details(count)
|
||||
except IOError, e:
|
||||
return serve_template(templatename="recently_added.html", recently_added=None)
|
||||
|
||||
if result:
|
||||
return serve_template(templatename="recently_added.html", recently_added=result['recently_added'])
|
||||
else:
|
||||
return serve_template(templatename="recently_added.html", recently_added=None)
|
||||
logger.warn('Unable to retrieve data.')
|
||||
|
||||
@cherrypy.expose
|
||||
def pms_image_proxy(self, img='', width='0', height='0', **kwargs):
|
||||
if img != '':
|
||||
|
@ -729,3 +744,15 @@ class WebInterface(object):
|
|||
return result
|
||||
else:
|
||||
logger.warn('Unable to retrieve data.')
|
||||
|
||||
@cherrypy.expose
|
||||
def get_recently_added_json(self, count='0', **kwargs):
|
||||
|
||||
pms_connect = pmsconnect.PmsConnect()
|
||||
result = pms_connect.get_recently_added(count, 'json')
|
||||
|
||||
if result:
|
||||
cherrypy.response.headers['Content-type'] = 'application/json'
|
||||
return result
|
||||
else:
|
||||
logger.warn('Unable to retrieve data.')
|
Loading…
Add table
Add a link
Reference in a new issue