def post_all_feeds(): """Post all new items for feeds for a specific interval""" if request.headers.get('X-Appengine-Cron') != 'true': raise ndb.Return(jsonify_error(message='Not a cron call')) feed_classes = (Feed, InstagramFeed) iterators = [x.query().iter() for x in feed_classes] errors = 0 success = 0 num_posted = 0 futures = [] for iterator in iterators: while (yield iterator.has_next_async()): feed = iterator.next() futures.append((feed, Entry.publish_for_feed(feed))) for feed, future in futures: try: num_posts = yield future if num_posts is not None: num_posted += num_posts success += 1 except: errors += 1 logger.exception('Failed to Publish feed:%s' % (feed.feed_url, )) stat = yield write_epoch_to_stat(Stat, 'post_job') logger.info('Post Feeds success:%s errors: %s num_posted: %s', success, errors, num_posted) raise ndb.Return(jsonify(status='ok'))
def feed_push_update(feed_key): feed = ndb.Key(urlsafe=feed_key).get() if not feed: raise ndb.Return(("No feed", 404)) data = request.stream.read() if feed.hub_secret: server_signature = request.headers.get('X-Hub-Signature', None) signature = hmac.new(feed.hub_secret, data).hexdigest() if server_signature != signature: logger.warn('Got PuSH subscribe POST for feed key=%s w/o valid signature: sent=%s != expected=%s', feed_key, server_signature, signature) raise ndb.Return('') logger.info('Got PuSH body: %s', data) logger.info('Got PuSH headers: %s', request.headers) parsed_feed = feedparser.parse(data) new_guids, old_guids = yield Entry.process_parsed_feed(parsed_feed, feed, overflow=False) yield Entry.publish_for_feed(feed, skip_queue=False) raise ndb.Return('')