]> git.gir.st - subscriptionfeed.git/blob - app/reddit/__init__.py
rework fetch_reddit() params, support non-hot-ordering (undocumented)
[subscriptionfeed.git] / app / reddit / __init__.py
1 import re
2 import sqlite3
3 from flask_login import current_user, login_required
4 from flask import Blueprint, render_template, request, redirect, flash
5
6 from ..common.common import *
7
8 frontend = Blueprint('reddit', __name__,
9 template_folder='templates',
10 static_folder='static',
11 static_url_path='/static/rd')
12
13 @frontend.route('/feed/subreddits')
14 @frontend.route('/r/<subreddit>')
15 def reddit(subreddit=None):
16 token = getattr(current_user, 'token', 'guest')
17 count = int(request.args.get('count', 0))
18 before = request.args.get('before')
19 after = request.args.get('after')
20
21 sortorder = request.args.get('s', "hot") # TODO: verify!
22 timerange = request.args.get('t', None) # TODO: verify!
23
24 all_subreddits = get_subreddits(token)
25 subreddits = [subreddit] if subreddit else all_subreddits
26
27 try:
28 videos, before, after = fetch_reddit(subreddits,
29 sorted_by=sortorder, time=timerange, limit=36,
30 count=count, before=before, after=after)
31 except RedditException as e:
32 return f"error retrieving reddit data: {e}", 502 # TODO: better
33
34 # TODO: for /feed/reddit: pin/hide videos
35
36 title = f"/r/{subreddit}" if subreddit else "my subreddits"
37 return render_template('reddit.html.j2', title=title, rows=videos,
38 subreddits=all_subreddits, before=before, after=after, count=count)
39
40 @frontend.route('/manage/subreddits')
41 # disabled for guest user: @login_required
42 def subscription_manager():
43 token = getattr(current_user, 'token', 'guest')
44 subreddits = get_subreddits(token)
45 return render_template('subreddit_manager.html.j2', subreddits=subreddits)
46
47 @frontend.route('/feed/subreddits', methods=['POST'])
48 @login_required
49 def feed_post():
50 token = current_user.token
51
52 action = next(request.form.keys(), None)
53 if action in ['pin', 'unpin', 'hide']:
54 post_id = request.form.get(action)
55 display = {
56 'pin': 'pinned',
57 'unpin': None,
58 'hide': 'hidden',
59 }[action]
60 with sqlite3.connect(cf['global']['database']) as conn:
61 c = conn.cursor()
62 c.execute("""
63 INSERT OR REPLACE INTO flags (user, post_id, display)
64 VALUES (?, ?, ?)
65 """, (token, post_id, display))
66 else:
67 flash("unsupported action", "error")
68 return redirect(request.url, code=303)
69
70 @frontend.route('/manage/subreddits', methods=['POST'])
71 @login_required
72 def manage_subscriptions():
73 token = current_user.token
74 if 'subscribe' in request.form:
75 subreddit = request.form.get("subscribe")
76 match = re.search(r"(?:(?:https?://)?(?:old.|www.|\w\w.)?reddit.com)?(?:/?r/)?([-+_0-9A-Za-z]{2,21})", subreddit)
77 if match:
78 subreddit = match.group(1)
79 else:
80 flash("invalid subreddit", "error")
81 return redirect(request.url, code=303)
82 with sqlite3.connect(cf['global']['database']) as conn:
83 c = conn.cursor()
84 c.execute("""
85 INSERT OR IGNORE INTO subreddits (user, subreddit)
86 VALUES (?, ?)
87 """, (token, subreddit))
88
89 elif 'unsubscribe' in request.form:
90 subreddit = request.form.get("unsubscribe")
91 with sqlite3.connect(cf['global']['database']) as conn:
92 c = conn.cursor()
93 c.execute("""
94 DELETE FROM subreddits
95 WHERE user = ? AND subreddit = ?
96 """, (token, subreddit))
97 # TODO: sql-error-handling, report success
98
99 else:
100 flash("unsupported action", "error")
101
102 return redirect(request.url, code=303)
103
104 def get_subreddits(token):
105 with sqlite3.connect(cf['global']['database']) as conn:
106 c = conn.cursor()
107 c.execute("""
108 SELECT subreddit
109 FROM subreddits
110 WHERE user = ?
111 ORDER BY subreddit COLLATE NOCASE ASC
112 """, (token,))
113 subreddits = [sr for (sr,) in c.fetchall()]
114 return subreddits
115
116 @frontend.app_template_filter('trim3')
117 def trim3(n):
118 if round(n, 1) >= 10_000:
119 return "%.0fk" % (n/1000)
120 elif n >= 1_000:
121 return "%.1fk" % (n/1000)
122 else:
123 return "%d" % n
Imprint / Impressum