60 lines
2.4 KiB
Python
60 lines
2.4 KiB
Python
"""
|
|
Update feeds for Django community page. Requires Mark Pilgrim's excellent
|
|
Universal Feed Parser (http://feedparser.org)
|
|
"""
|
|
|
|
from aggregator.models import Feed
|
|
from django.core.management.base import BaseCommand
|
|
|
|
class Command(BaseCommand):
|
|
help = "Updates all RSS Feeds"
|
|
|
|
def parse_feed(self, feed, verbose=True):
|
|
parsed_feed = feedparser.parse(feed.feed_url)
|
|
html_parser = HTMLParser.HTMLParser()
|
|
for entry in parsed_feed:
|
|
title = entry.title.encode(parsed_feed.encoding, "xmlcharrefreplace")
|
|
guid = entry.get("id", entry.link).encode(parsed_feed.encoding, "xmlcharrefreplace")
|
|
link = entry.link.encode(parsed_feed.encoding, "xmlcharrefreplace")
|
|
if verbose:
|
|
print '>' , title
|
|
|
|
if not guid:
|
|
guid = link
|
|
|
|
if hasattr(entry, "summary"):
|
|
content = entry.summary
|
|
elif hasattr(entry, "content"):
|
|
content = entry.content[0].value
|
|
elif hasattr(entry, "description"):
|
|
content = entry.description
|
|
else:
|
|
content = u""
|
|
content = content.encode(parsed_feed.encoding, "xmlcharrefreplace")
|
|
|
|
try:
|
|
if entry.has_key('modified_parsed'):
|
|
date_modified = datetime.fromtimestamp(time.mktime(entry.modified_parsed))
|
|
elif parsed_feed.feed.has_key('modified_parsed'):
|
|
date_modified = datetime.fromtimestamp(time.mktime(parsed_feed.feed.modified_parsed))
|
|
elif parsed_feed.has_key('modified'):
|
|
date_modified = datetime.fromtimestamp(time.mktime(parsed_feed.modified))
|
|
else:
|
|
date_modified = datetime.now()
|
|
except TypeError:
|
|
date_modified = datetime.now()
|
|
|
|
try:
|
|
feed.feeditem_set.get(guid=guid)
|
|
except FeedItem.DoesNotExist:
|
|
feed.feeditem_set.create(title=title, link=link, summary=content, guid=guid, date_modified=date_modified)
|
|
|
|
def handle(self, *args, **options):
|
|
verbose = int(options['verbosity']) > 0
|
|
for feed in Feed.objects.filter(is_functional=True):
|
|
if (verbose):
|
|
print
|
|
print "%s - URL: %s" % (feed.title, feed.feed_url)
|
|
print '=' * 80
|
|
feed.parse()
|