Add recently added to home screen.

This commit is contained in:
Tim 2015-06-16 23:22:03 +02:00
parent af028cb1d9
commit 473ea7513c
4 changed files with 195 additions and 1 deletions

View file

@ -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>

View 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

View file

@ -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.

View file

@ -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.')