mirror of
https://github.com/viq/NewsBlur.git
synced 2025-09-18 21:43:31 +00:00
Importing feed's original page along with RSS stories. Wowzers.
This commit is contained in:
parent
848eaacdf1
commit
0f4cfdffb7
7 changed files with 104 additions and 1 deletions
|
@ -3,6 +3,7 @@ from django.conf.urls.defaults import *
|
|||
urlpatterns = patterns('apps.reader.views',
|
||||
(r'^$', 'index'),
|
||||
(r'^load_single_feed', 'load_single_feed'),
|
||||
(r'^load_feed_page', 'load_feed_page'),
|
||||
(r'^load_feeds', 'load_feeds'),
|
||||
(r'^refresh_all_feeds', 'refresh_all_feeds'),
|
||||
(r'^refresh_feed', 'refresh_feed'),
|
||||
|
|
|
@ -11,6 +11,7 @@ from django.http import HttpResponse, HttpRequest
|
|||
from django.core import serializers
|
||||
from django.utils.safestring import mark_safe
|
||||
from django.views.decorators.cache import cache_page
|
||||
from djangologging.decorators import suppress_logging_output
|
||||
import logging
|
||||
import datetime
|
||||
import threading
|
||||
|
@ -112,6 +113,7 @@ def load_feeds(request):
|
|||
feed['feeds'].sort(lambda x, y: cmp(x.feed_title.lower(), y.feed_title.lower()))
|
||||
for f in feed['feeds']:
|
||||
f.feed_address = mark_safe(f.feed_address)
|
||||
f.page_data = None
|
||||
|
||||
cache.set('usersub:%s' % user, feeds, SINGLE_DAY)
|
||||
|
||||
|
@ -159,6 +161,12 @@ def load_single_feed(request):
|
|||
data = json_encode(context)
|
||||
return HttpResponse(data, mimetype='text/html')
|
||||
|
||||
@suppress_logging_output
|
||||
def load_feed_page(request):
|
||||
feed = Feed.objects.get(id=request.REQUEST.get('feed_id'))
|
||||
data = feed.page_data
|
||||
|
||||
return HttpResponse(data, mimetype='text/html')
|
||||
|
||||
@login_required
|
||||
def mark_story_as_read(request):
|
||||
|
|
40
apps/rss_feeds/importer.py
Normal file
40
apps/rss_feeds/importer.py
Normal file
|
@ -0,0 +1,40 @@
|
|||
import urllib2
|
||||
import logging
|
||||
import re
|
||||
import urlparse
|
||||
|
||||
class PageImporter(object):
|
||||
|
||||
def __init__(self, url, feed):
|
||||
self.url = url
|
||||
self.feed = feed
|
||||
|
||||
def fetch_page(self):
|
||||
request = urllib2.Request(self.url)
|
||||
|
||||
try:
|
||||
response = urllib2.urlopen(request)
|
||||
except HTTPError, e:
|
||||
logging.error('The server couldn\'t fulfill the request. Error: %s' % e.code)
|
||||
except URLError, e:
|
||||
logging.error('Failed to reach server. Reason: %s' % e.reason)
|
||||
else:
|
||||
data = response.read()
|
||||
html = data
|
||||
html = self.rewrite_page(html)
|
||||
self.save_page(html)
|
||||
|
||||
def rewrite_page(self, response):
|
||||
head = response.find('<head>') + 6
|
||||
base_code = u'<base href="%s" />' % (self.feed.feed_link,)
|
||||
try:
|
||||
html = u''.join([response[:head], base_code, response[head:]])
|
||||
except:
|
||||
response = response.decode('latin1').encode('utf-8')
|
||||
html = u''.join([response[:head], base_code, response[head:]])
|
||||
|
||||
return html
|
||||
|
||||
def save_page(self, html):
|
||||
self.feed.page_data = html
|
||||
self.feed.save()
|
|
@ -12,6 +12,7 @@ from utils.story_functions import format_story_link_date__short
|
|||
from utils.story_functions import format_story_link_date__long
|
||||
from django.db.models import Q
|
||||
from utils.diff import HTMLDiff
|
||||
from apps.rss_feeds.importer import PageImporter
|
||||
import settings
|
||||
import logging
|
||||
|
||||
|
@ -30,6 +31,7 @@ class Feed(models.Model):
|
|||
creation = models.DateField(auto_now_add=True)
|
||||
etag = models.CharField(max_length=50, blank=True)
|
||||
last_modified = models.DateTimeField(null=True, blank=True)
|
||||
page_data = models.TextField(blank=True)
|
||||
|
||||
|
||||
def __unicode__(self):
|
||||
|
@ -89,6 +91,10 @@ class Feed(models.Model):
|
|||
self.last_update = datetime.datetime.now()
|
||||
self.last_modified = mtime(feed.get('modified',
|
||||
datetime.datetime.timetuple(datetime.datetime.now())))
|
||||
|
||||
page_importer = PageImporter(self.feed_link, self)
|
||||
self.page = page_importer.fetch_page()
|
||||
|
||||
self.save()
|
||||
|
||||
num_entries = len(feed['entries'])
|
||||
|
|
|
@ -539,3 +539,13 @@ form.opml_import_form input {
|
|||
background-color: #FFFFA0;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
|
||||
/* ============== */
|
||||
/* = Feed Frame = */
|
||||
/* ============== */
|
||||
|
||||
.NB-feed-frame {
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
}
|
|
@ -56,8 +56,10 @@ NEWSBLUR.AssetModel.Reader.prototype = {
|
|||
$('#django_log').replaceWith(log_html);
|
||||
var js = eval(log_js);
|
||||
}
|
||||
} else {
|
||||
} else if (o.indexOf('{') == 0) {
|
||||
data = eval('(' + o + ')');
|
||||
} else {
|
||||
data = o;
|
||||
}
|
||||
|
||||
if (callback && typeof callback == 'function'){
|
||||
|
@ -173,6 +175,17 @@ NEWSBLUR.AssetModel.Reader.prototype = {
|
|||
);
|
||||
},
|
||||
|
||||
load_feed_page: function(feed_id, page, callback) {
|
||||
var self = this;
|
||||
|
||||
this.make_request('/reader/load_feed_page',
|
||||
{
|
||||
feed_id: feed_id,
|
||||
page: page
|
||||
}, callback
|
||||
);
|
||||
},
|
||||
|
||||
get_feed: function(feed_id, callback) {
|
||||
var self = this;
|
||||
for (fld in this.folders) {
|
||||
|
|
|
@ -274,6 +274,8 @@
|
|||
this.show_feed_title_in_stories($story_titles, feed_id);
|
||||
this.mark_feed_as_selected(feed_id, $feed_link);
|
||||
this.model.load_feed(feed_id, 0, $.rescope(this.create_story_titles, this));
|
||||
// this.model.load_feed_page(feed_id, 0, $.rescope(this.show_feed_page_contents, this));
|
||||
this.show_feed_page_contents(feed_id);
|
||||
},
|
||||
|
||||
create_story_titles: function(e, stories) {
|
||||
|
@ -300,6 +302,13 @@
|
|||
this.hover_over_story_titles($story_titles);
|
||||
},
|
||||
|
||||
show_feed_page_contents: function(feed_id) {
|
||||
var $story_pane = this.$story_pane;
|
||||
var $story_iframe = $.make('iframe', { className: 'NB-feed-frame' });
|
||||
$story_pane.html($story_iframe);
|
||||
$story_iframe.attr({src: '/reader/load_feed_page?feed_id='+feed_id});
|
||||
},
|
||||
|
||||
load_page_of_feed_stories: function() {
|
||||
var feed_id = this.$story_titles.data('feed_id');
|
||||
var page = this.$story_titles.data('page');
|
||||
|
@ -394,6 +403,22 @@
|
|||
}
|
||||
this.mark_story_title_as_selected(story_id, $st);
|
||||
this.mark_story_as_read(story_id, $st);
|
||||
|
||||
this.scroll_to_story_in_story_frame(story.story_title);
|
||||
},
|
||||
|
||||
scroll_to_story_in_story_frame: function(story_title) {
|
||||
var $iframe = $('.NB-feed-frame');
|
||||
var title = story_title.replace('^\s+|\s+$', '');
|
||||
|
||||
NEWSBLUR.log(['Title', title]);
|
||||
|
||||
$iframe.contents().find(':contains('+title+')').each(function(){
|
||||
if($(this).children().length < 1) {
|
||||
$iframe.scrollTo(this, 1000);
|
||||
return false;
|
||||
}
|
||||
});
|
||||
},
|
||||
|
||||
open_story_link: function(story_id, $st) {
|
||||
|
|
Loading…
Add table
Reference in a new issue