import re import sqlite3 from flask_login import current_user, login_required from flask import Blueprint, render_template, request, redirect, flash from ..common.common import * frontend = Blueprint('reddit', __name__, template_folder='templates', static_folder='static', static_url_path='/static/rd') @frontend.route('/feed/subreddits') @frontend.route('/r/') def reddit(subreddit=None): token = getattr(current_user, 'token', 'guest') count = int(request.args.get('count', 0)) before = request.args.get('before') after = request.args.get('after') all_subreddits = get_subreddits(token) subreddits = [subreddit] if subreddit else all_subreddits try: videos, before, after = fetch_reddit(subreddits, [], count, before, after) except RedditException as e: return f"error retrieving reddit data: {e}", 502 # TODO: better # TODO: for /feed/reddit: pin/hide videos title = f"/r/{subreddit}" if subreddit else "my subreddits" return render_template('reddit.html.j2', title=title, rows=videos, subreddits=all_subreddits, before=before, after=after, count=count) @frontend.route('/manage/subreddits') # disabled for guest user: @login_required def subscription_manager(): token = getattr(current_user, 'token', 'guest') subreddits = get_subreddits(token) return render_template('subreddit_manager.html.j2', subreddits=subreddits) @frontend.route('/feed/subreddits', methods=['POST']) @login_required def feed_post(): token = current_user.token action = next(request.form.keys(), None) if action in ['pin', 'unpin', 'hide']: post_id = request.form.get(action) display = { 'pin': 'pinned', 'unpin': None, 'hide': 'hidden', }[action] with sqlite3.connect(cf['global']['database']) as conn: c = conn.cursor() c.execute(""" INSERT OR REPLACE INTO flags (user, post_id, display) VALUES (?, ?, ?) """, (token, post_id, display)) else: flash("unsupported action", "error") return redirect(request.url, code=303) @frontend.route('/manage/subreddits', methods=['POST']) @login_required def manage_subscriptions(): token = current_user.token if 'subscribe' in request.form: subreddit = request.form.get("subscribe") match = re.search(r"(?:(?:https?://)?(?:old.|www.|\w\w.)?reddit.com)?(?:/?r/)?([-+_0-9A-Za-z]{2,21})", subreddit) if match: subreddit = match.group(1) else: flash("invalid subreddit", "error") return redirect(request.url, code=303) with sqlite3.connect(cf['global']['database']) as conn: c = conn.cursor() c.execute(""" INSERT OR IGNORE INTO subreddits (user, subreddit) VALUES (?, ?) """, (token, subreddit)) elif 'unsubscribe' in request.form: subreddit = request.form.get("unsubscribe") with sqlite3.connect(cf['global']['database']) as conn: c = conn.cursor() c.execute(""" DELETE FROM subreddits WHERE user = ? AND subreddit = ? """, (token, subreddit)) # TODO: sql-error-handling, report success else: flash("unsupported action", "error") return redirect(request.url, code=303) def get_subreddits(token): with sqlite3.connect(cf['global']['database']) as conn: c = conn.cursor() c.execute(""" SELECT subreddit FROM subreddits WHERE user = ? ORDER BY subreddit COLLATE NOCASE ASC """, (token,)) subreddits = [sr for (sr,) in c.fetchall()] return subreddits @frontend.app_template_filter('trim3') def trim3(n): if round(n, 1) >= 10_000: return "%.0fk" % (n/1000) elif n >= 1_000: return "%.1fk" % (n/1000) else: return "%d" % n