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