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