-
Notifications
You must be signed in to change notification settings - Fork 0
/
server.py
78 lines (59 loc) · 2.08 KB
/
server.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
import json, random, os
from flask import Flask, request, Response
import lxml
import utils
BASE_DIR = os.path.dirname(os.path.abspath(__file__))
cache = os.environ.get('cache', os.path.join(BASE_DIR, 'cache'))
app = Flask(__name__)
if not os.path.exists(cache):
os.mkdir(cache)
def _should_add_item(request):
if request.args.get('random', False):
new = True if random.random() > 0.5 else False
else:
new = request.args.get('new', False)
return new
@app.route("/")
def home():
return "Hello World!"
@app.route('/rss/<feed_id>')
def rss(feed_id):
path = '{}.xml'.format(os.path.join(cache, feed_id))
clear = request.args.get('clear', False)
if not clear:
try:
with open(path, 'r') as f:
# Get the feed from the cache or make new.
feed = lxml.etree.parse(f)
except (FileNotFoundError):
feed = utils.get_default_rssfeed(feed_id)
else:
feed = utils.get_default_rssfeed(feed_id)
if _should_add_item(request):
new_item = utils.get_new_rssfeed_item()
feed.xpath('/rss/channel')[0].insert(0, new_item)
data = lxml.etree.tostring(feed)
with open(path, 'wb+') as f:
f.seek(0)
f.write(data)
return Response(data, mimetype='application/xml')
@app.route('/jsonfeed/<feed_id>')
def jsonfeed(feed_id):
path = '{}.json'.format(os.path.join(cache, feed_id))
clear = request.args.get('clear', False)
if not clear:
try:
with open(path, 'r') as f:
# Get the feed from the cache or make new.
feed = json.load(f)
except (json.decoder.JSONDecodeError, FileNotFoundError):
feed = utils.get_default_jsonfeed(feed_id)
else:
feed = utils.get_default_jsonfeed(feed_id)
if _should_add_item(request):
new_item = utils.get_new_jsonfeed_item()
feed['items'].insert(0, new_item)
with open(path, 'w+') as f:
f.seek(0)
json.dump(feed, f, sort_keys=True)
return Response(json.dumps(feed, indent=2), mimetype='application/json')