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>
|
||||||
</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>
|
</div>
|
||||||
</%def>
|
</%def>
|
||||||
|
|
||||||
<%def name="javascriptIncludes()">
|
<%def name="javascriptIncludes()">
|
||||||
|
<script src="interfaces/default/js/moment-with-locale.js"></script>
|
||||||
<script>
|
<script>
|
||||||
function currentActivity() {
|
function currentActivity() {
|
||||||
$.ajax({
|
$.ajax({
|
||||||
|
@ -58,6 +69,32 @@
|
||||||
currentActivityHeader();
|
currentActivityHeader();
|
||||||
setInterval(currentActivityHeader, 15000);
|
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>
|
</script>
|
||||||
|
|
||||||
</%def>
|
</%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 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.
|
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)
|
return serve_template(templatename="current_activity_header.html", activity=None)
|
||||||
logger.warn('Unable to retrieve data.')
|
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
|
@cherrypy.expose
|
||||||
def pms_image_proxy(self, img='', width='0', height='0', **kwargs):
|
def pms_image_proxy(self, img='', width='0', height='0', **kwargs):
|
||||||
if img != '':
|
if img != '':
|
||||||
|
@ -729,3 +744,15 @@ class WebInterface(object):
|
||||||
return result
|
return result
|
||||||
else:
|
else:
|
||||||
logger.warn('Unable to retrieve data.')
|
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