#!/usr/bin/env python # Delicious # # Douglas Thrift # # $Id$ from __init__ import lock import calendar from ccscslab.delicious.models import Bookmark, User from ccscslab.facebook import utils from ccscslab.main.utils import unescape import cgi from datetime import datetime, timedelta from django.conf import settings from django.db import transaction import dtflickr import feedparser import hashlib import optparse import re import urllib2 try: import simplejson as json except ImportError: import json feedparser.SANITIZE_HTML = 0 if __name__ == '__main__': parser = optparse.OptionParser() parser.add_option('-D', '--debug', action = 'store_true', dest = 'debug') options = parser.parse_args()[0] lock(options.debug) title = re.compile(r'^(?:del\.icio\.us|Delicious)/.*/ccscslab(?:: (.*))?$') now = datetime.utcnow() end = now.replace(minute = now.minute - now.minute % 5, second = 0, microsecond = 0) + timedelta(minutes = 5) del now flickr = dtflickr.Flickr(settings.FLICKR_API_KEY) @transaction.commit_on_success def bookmarks(): if options.debug: print user.name + ':' rss = feedparser.parse('http://feeds.delicious.com/rss/' + user.name + '/ccscslab') try: user.title = title.sub(r'\1', rss.feed.title) except re.error: user.title = '' user.description = rss.feed.subtitle if rss.feed.subtitle != 'bookmarks tagged ccscslab by ' + user.name else '' user.count = json.load(urllib2.urlopen('http://feeds.delicious.com/v2/json/tags/' + user.name)).get('ccscslab', 0) for entry in rss.entries[:5]: url = entry.link if options.debug: print ' ' + url md5 = hashlib.md5() md5.update(url) hash = md5.hexdigest() bookmark, inserted = Bookmark.objects.get_or_create(user = user, hash = hash, url = url, defaults = {'posted': datetime.utcnow()}) bookmark.posted = datetime.utcfromtimestamp(calendar.timegm(entry.updated_parsed)) bookmark.description = entry.title bookmark.notes = unescape(entry.get('summary', '')) bookmark.tags = entry.tags[0].term bookmark.others = int(json.load(urllib2.urlopen('http://feeds.delicious.com/v2/json/urlinfo/data?hash=' + hash))[0].get('total_posts', 1)) - 1 if bookmark.others < 0: bookmark.others = 0 bookmark.save() if options.debug: print ' ' + ('inserted' if inserted else 'updated') if inserted and user.user is not None and utils.set_user(user.user.id): photo = dtflickr.getURLDetails(url) template_data = {'url': bookmark.url, 'description': bookmark.description} if photo is not None: if 'photo' in photo: try: if 'farm' not in photo: photo = flickr.photos.getInfo(photo_id = photo.photo).photo photo = dtflickr.getPhotoSourceURL(photo, dtflickr.SmallSquare) template_data['images'] = [{'src': photo, 'href': url}] except dtflickr.Failure: photo = None elif 'photoset' in photo: # TODO: do something for photosets photo = None else: photo = None utils.publish('delicious', template_data = template_data, body_general = '%s tagged %s with ccscslab.' % (user.user.id, user.user.get_facebook_url(), user.name, cgi.escape(bookmark.url, True), cgi.escape(bookmark.description), user.get_absolute_url()), story_size = 2) user.save() for bookmark in user.bookmark_set.all()[10:]: bookmark.delete() if options.debug: print ' deleted' for user in User.objects.filter(updated__lt = datetime.utcnow() - timedelta(minutes = 30)): bookmarks() if datetime.utcnow() >= end: break