-
Notifications
You must be signed in to change notification settings - Fork 0
/
main.py
89 lines (64 loc) · 2.59 KB
/
main.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
from time import mktime
from datetime import datetime
import logging
import endpoints
from google.appengine.ext import ndb
from endpoints_proto_datastore.ndb import EndpointsModel
from webapp2_extras.appengine.auth.models import Unique
from protorpc import remote
from flask import Flask, render_template
import feedparser
app = Flask(__name__)
GOODREADS_RSS_URL = 'https://www.goodreads.com/quotes_of_the_day/rss'
class Quote(EndpointsModel):
text = ndb.StringProperty(required=False)
author = ndb.StringProperty(required=False)
# author_link = db.StringProperty(required=False)
link = ndb.StringProperty(required=False)
date = ndb.DateTimeProperty(required=False)
date_modified = ndb.DateTimeProperty(auto_now_add=True)
@endpoints.api(name='quotesapi', version='v1',
description='quotes of the day api')
class QuoteApi(remote.Service):
@Quote.query_method(path='quotes', name='quote.list')
def QuoteList(self, query):
return query.order(-Quote.date)
def read_feed():
feedparser._HTMLSanitizer.acceptable_elements = [] # cleans up all html tag
feeds = feedparser.parse(GOODREADS_RSS_URL)
for feed in feeds.entries:
clearer_date = datetime.fromtimestamp(mktime(feed.published_parsed))
uniques = ['Quote.link.%s' % feed.link,
'Quote.date.%s' % clearer_date, ]
# transactionally create the unique quote based on date and link
# https://webapp-improved.appspot.com/_modules/webapp2_extras/appengine/auth/models.html#Unique
success, existing = Unique.create_multi(uniques)
if success:
quote = Quote()
quote.date = clearer_date
parsed_summary = [a for a in feed.summary.splitlines()
if a and a != '-']
quote.text = parsed_summary[0]
quote.author = parsed_summary[1]
quote.link = feed.link
quote.put()
logging.info(
'New feed: {}, dated: {} has been inserted into the datastore'
.format(feed.link, clearer_date)
)
else:
logging.debug('Properties %r are not unique.' % existing)
@app.template_filter()
def dateformat(value, format='%a, %d %b, %Y'):
return value.strftime(format)
@app.route('/cron')
def cron():
read_feed()
return 'updated quotes'
@app.route('/')
def home():
quotes = Quote.query().order(-Quote.date).fetch(7)
return render_template('home.html', quotes=quotes)
api = endpoints.api_server([QuoteApi], restricted=False)
if __name__ == '__main__':
app.run(debug=False)