Importing feed's original page along with RSS stories. Wowzers.

This commit is contained in:
Samuel Clay 2009-08-13 03:26:12 +00:00
parent 848eaacdf1
commit 0f4cfdffb7
7 changed files with 104 additions and 1 deletions

View file

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

View file

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

View 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()

View file

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

View file

@ -539,3 +539,13 @@ form.opml_import_form input {
background-color: #FFFFA0;
cursor: pointer;
}
/* ============== */
/* = Feed Frame = */
/* ============== */
.NB-feed-frame {
width: 100%;
height: 100%;
}

View file

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

View file

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