mirror of
https://github.com/viq/NewsBlur.git
synced 2025-09-18 21:43:31 +00:00
Dynamically refreshing feeds in real-time. This is now a real-time service, and there's no looking back.
This commit is contained in:
parent
b7d7b4b1a0
commit
67cc20c272
4 changed files with 86 additions and 12 deletions
|
@ -8,6 +8,7 @@ urlpatterns = patterns('',
|
|||
(r'^load_single_feed', views.load_single_feed),
|
||||
(r'^load_feed_page', views.load_feed_page),
|
||||
(r'^load_feeds', views.load_feeds),
|
||||
(r'^refresh_feeds', views.refresh_feeds),
|
||||
(r'^mark_story_as_read', views.mark_story_as_read),
|
||||
(r'^mark_story_as_like', views.mark_story_as_like),
|
||||
(r'^mark_story_as_dislike', views.mark_story_as_dislike),
|
||||
|
|
|
@ -78,14 +78,31 @@ def load_feeds(request):
|
|||
'id': sub.feed.pk,
|
||||
'feed_title': sub.feed.feed_title,
|
||||
'feed_link': sub.feed.feed_link,
|
||||
'unread_count_positive': sub.unread_count_positive,
|
||||
'unread_count_neutral': sub.unread_count_neutral,
|
||||
'unread_count_negative': sub.unread_count_negative,
|
||||
'ps': sub.unread_count_positive,
|
||||
'nt': sub.unread_count_neutral,
|
||||
'ng': sub.unread_count_negative,
|
||||
}
|
||||
|
||||
data = dict(feeds=feeds, folders=json.decode(folders.folders))
|
||||
return HttpResponse(json.encode(data), mimetype='application/json')
|
||||
|
||||
def refresh_feeds(request):
|
||||
user = get_user(request)
|
||||
feeds = {}
|
||||
|
||||
user_subs = UserSubscription.objects.select_related('feed').filter(user=user)
|
||||
|
||||
for sub in user_subs:
|
||||
if sub.needs_unread_recalc:
|
||||
sub.calculate_feed_scores()
|
||||
feeds[sub.feed.pk] = {
|
||||
'ps': sub.unread_count_positive,
|
||||
'nt': sub.unread_count_neutral,
|
||||
'ng': sub.unread_count_negative,
|
||||
}
|
||||
|
||||
return HttpResponse(json.encode(feeds), mimetype='application/json')
|
||||
|
||||
def load_single_feed(request):
|
||||
user = get_user(request)
|
||||
|
||||
|
|
|
@ -211,6 +211,30 @@ NEWSBLUR.AssetModel.Reader.prototype = {
|
|||
}
|
||||
},
|
||||
|
||||
refresh_feeds: function(callback) {
|
||||
var self = this;
|
||||
|
||||
var pre_callback = function(feeds) {
|
||||
var updated_feeds = [];
|
||||
|
||||
for (var f in feeds) {
|
||||
var feed = feeds[f];
|
||||
for (var k in feed) {
|
||||
if (self.feeds[f][k] != feed[k]) {
|
||||
// NEWSBLUR.log(['New Feed', self.feeds[f][k], feed[k], f, k]);
|
||||
self.feeds[f][k] = feed[k];
|
||||
if (!(f in updated_feeds)) {
|
||||
updated_feeds.push(f);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
callback(updated_feeds);
|
||||
};
|
||||
|
||||
this.make_request('/reader/refresh_feeds', {}, pre_callback);
|
||||
},
|
||||
|
||||
get_feed: function(feed_id) {
|
||||
var self = this;
|
||||
|
||||
|
|
|
@ -39,6 +39,7 @@
|
|||
this.handle_keystrokes();
|
||||
this.setup_feed_page_iframe_load();
|
||||
this.load_intelligence_slider();
|
||||
this.setup_feed_refresh();
|
||||
};
|
||||
|
||||
NEWSBLUR.Reader.prototype = {
|
||||
|
@ -392,13 +393,13 @@
|
|||
|
||||
make_feed_title_line: function(feed, list_item) {
|
||||
var unread_class = '';
|
||||
if (feed.unread_count_positive) {
|
||||
if (feed.ps) {
|
||||
unread_class += ' unread_positive';
|
||||
}
|
||||
if (feed.unread_count_neutral) {
|
||||
if (feed.nt) {
|
||||
unread_class += ' unread_neutral';
|
||||
}
|
||||
if (feed.unread_count_negative) {
|
||||
if (feed.ng) {
|
||||
unread_class += ' unread_negative';
|
||||
}
|
||||
var $feed = $.make((list_item?'li':'div'), { className: 'feed ' + unread_class }, [
|
||||
|
@ -406,22 +407,22 @@
|
|||
$.make('div', { className: 'feed_counts_floater' }, [
|
||||
$.make('span', {
|
||||
className: 'unread_count unread_count_positive '
|
||||
+ (feed.unread_count_positive
|
||||
+ (feed.ps
|
||||
? "unread_count_full"
|
||||
: "unread_count_empty")
|
||||
}, ''+feed.unread_count_positive),
|
||||
}, ''+feed.ps),
|
||||
$.make('span', {
|
||||
className: 'unread_count unread_count_neutral '
|
||||
+ (feed.unread_count_neutral
|
||||
+ (feed.nt
|
||||
? "unread_count_full"
|
||||
: "unread_count_empty")
|
||||
}, ''+feed.unread_count_neutral),
|
||||
}, ''+feed.nt),
|
||||
$.make('span', {
|
||||
className: 'unread_count unread_count_negative '
|
||||
+ (feed.unread_count_negative
|
||||
+ (feed.ng
|
||||
? "unread_count_full"
|
||||
: "unread_count_empty")
|
||||
}, ''+feed.unread_count_negative)
|
||||
}, ''+feed.ng)
|
||||
])
|
||||
]),
|
||||
$.make('img', { className: 'feed_favicon', src: this.google_favicon_url + feed.feed_link }),
|
||||
|
@ -1704,6 +1705,37 @@
|
|||
|
||||
},
|
||||
|
||||
// ===================
|
||||
// = Feed Refreshing =
|
||||
// ===================
|
||||
|
||||
setup_feed_refresh: function() {
|
||||
var self = this;
|
||||
var FEED_REFRESH_INTERVAL = 1000 * 60 * 5; // 5 minutes
|
||||
|
||||
this.flags.feed_refresh = setInterval(function() {
|
||||
self.model.refresh_feeds($.rescope(self.post_feed_refresh, self));
|
||||
}, FEED_REFRESH_INTERVAL);
|
||||
},
|
||||
|
||||
post_feed_refresh: function(e, updated_feeds) {
|
||||
var feeds = this.model.feeds;
|
||||
|
||||
for (var f in updated_feeds) {
|
||||
var feed_id = updated_feeds[f];
|
||||
var feed = this.model.get_feed(feed_id);
|
||||
var $feed = this.make_feed_title_line(feed, true);
|
||||
var $feed_on_page = this.find_feed_in_feed_list(feed_id);
|
||||
var selected = $feed_on_page.hasClass('selected');
|
||||
if (selected) {
|
||||
$feed.addClass('selected');
|
||||
}
|
||||
NEWSBLUR.log(['UPDATING', feed.feed_title, $feed, $feed_on_page]);
|
||||
$feed_on_page.replaceWith($feed);
|
||||
$('.unread_count', $feed).corner('4px');
|
||||
}
|
||||
},
|
||||
|
||||
// ===========
|
||||
// = Profile =
|
||||
// ===========
|
||||
|
|
Loading…
Add table
Reference in a new issue