]>
git.gir.st - subscriptionfeed.git/blob - app/reddit/__init__.py
3 from flask_login
import current_user
, login_required
4 from flask
import Blueprint
, render_template
, request
, redirect
, flash
, url_for
6 from ..common
.common
import *
9 frontend
= Blueprint('reddit', __name__
,
10 template_folder
='templates',
11 static_folder
='static',
12 static_url_path
='/static/rd')
14 @frontend.route('/feed/subreddits')
15 @frontend.route('/r/<subreddit>/')
16 def reddit(subreddit
=None):
17 token
= getattr(current_user
, 'token', 'guest')
18 count
= request
.args
.get('count', 0, type=int)
19 before
= request
.args
.get('before')
20 after
= request
.args
.get('after')
22 sortorder
= request
.args
.get('s', "hot") # TODO: verify!
23 timerange
= request
.args
.get('t', None) # TODO: verify!
25 all_subreddits
= get_subreddits(token
)
26 subreddits
= [subreddit
] if subreddit
else all_subreddits
30 data
= fetch_reddit(subreddits
,
31 sorted_by
=sortorder
, time
=timerange
, limit
=36,
32 count
=count
, before
=before
, after
=after
)
33 videos
= parse_reddit_videos(data
)
34 before
= data
['data']['before']
35 after
= data
['data']['after']
36 except RedditException
as e
:
37 return f
"error retrieving reddit data: <xmp>{e}</xmp>", 502 # TODO: better
39 # set pin/hide stati of retrieved videos
40 video_ids
= [v
['video_id'] for v
in videos
]
41 pinned
, hidden
= fetch_video_flags(token
, video_ids
)
43 {**v
, 'pinned': v
['video_id'] in pinned
}
45 if v
['video_id'] not in hidden
46 ], key
=lambda v
:v
['pinned'], reverse
=True)
47 else: # not subscribed to anything
50 title
= f
"/r/{subreddit}" if subreddit
else "my subreddits"
51 return render_template('reddit.html.j2', title
=title
, rows
=videos
,
52 subreddits
=all_subreddits
, before
=before
, after
=after
, count
=count
)
54 @frontend.route('/manage/subreddits')
55 # disabled for guest user: @login_required
56 def subscription_manager():
57 token
= getattr(current_user
, 'token', 'guest')
58 subreddits
= get_subreddits(token
)
59 return render_template('subreddit_manager.html.j2', subreddits
=subreddits
)
61 @frontend.route('/manage/subreddits', methods
=['POST'])
63 def manage_subscriptions():
64 token
= current_user
.token
65 if 'subscribe' in request
.form
:
66 subreddit
= request
.form
.get("subscribe")
67 match
= re
.search(r
"(?:(?:https?://)?(?:old.|www.|\w\w.)?reddit.com)?(?:/?r/)?([-+_0-9A-Za-z]{2,21})", subreddit
)
69 subreddit
= match
.group(1)
71 flash("invalid subreddit", "error")
72 return redirect(request
.url
, code
=303)
73 with sqlite3
.connect(cf
['global']['database']) as conn
:
76 INSERT OR IGNORE INTO subreddits (user, subreddit)
78 """, (token
, subreddit
))
80 elif 'unsubscribe' in request
.form
:
81 subreddit
= request
.form
.get("unsubscribe")
82 with sqlite3
.connect(cf
['global']['database']) as conn
:
85 DELETE FROM subreddits
86 WHERE user = ? AND subreddit = ?
87 """, (token
, subreddit
))
88 # TODO: sql-error-handling, report success
91 flash("unsupported action", "error")
93 return redirect(request
.url
, code
=303)
95 def get_subreddits(token
):
96 with sqlite3
.connect(cf
['global']['database']) as conn
:
102 ORDER BY subreddit COLLATE NOCASE ASC
104 subreddits
= [sr
for (sr
,) in c
.fetchall()]
107 @frontend.app_template_filter('trim3')
110 return n
# not a number
111 elif round(n
, 1) >= 10_000:
112 return "%.0fk" % (n
/1000)
114 return "%.1fk" % (n
/1000)
118 @frontend.before_app_request
119 def inject_reddit_button():
120 if not 'header_items' in g
:
122 g
.header_items
.append({
124 'url': url_for('reddit.reddit'),
125 'parent': frontend
.name
,