From 1c0b7ab846f6f20dafd9fd4dbf56b0afc0deb0bf Mon Sep 17 00:00:00 2001 From: girst Date: Sun, 20 Sep 2020 01:11:04 +0200 Subject: [PATCH] add display flags to /c/*; dedup flag retrieval code --- app/browse/__init__.py | 9 +++++++++ app/common/common.py | 17 +++++++++++++++++ app/reddit/__init__.py | 25 +++++++------------------ 3 files changed, 33 insertions(+), 18 deletions(-) diff --git a/app/browse/__init__.py b/app/browse/__init__.py index 6d2dc29..44083cb 100644 --- a/app/browse/__init__.py +++ b/app/browse/__init__.py @@ -77,6 +77,15 @@ def channel(channel_id, subpage="videos"): flash("unable to fetch results from ajax; displaying fallback results (15 newest)", "error") return fallback_route(channel_id, subpage) + # set pin/hide stati of retrieved videos: + video_ids = [card['content']['video_id'] for card in rows] + pinned, hidden = fetch_video_flags(token, video_ids) + rows = sorted([ + {'type':v['type'], 'content':{**v['content'], 'pinned': v['content']['video_id'] in pinned}} + for v in rows + if v['content']['video_id'] not in hidden + ], key=lambda v:v['content']['pinned'], reverse=True) + with sqlite3.connect(cf['global']['database']) as conn: c = conn.cursor() c.execute(""" diff --git a/app/common/common.py b/app/common/common.py index f4d3eb9..48fb686 100644 --- a/app/common/common.py +++ b/app/common/common.py @@ -326,6 +326,23 @@ def store_video_metadata(video_id): VALUES (?, ?) """, (meta['channel_id'], meta['author'])) +def fetch_video_flags(token, video_ids): + with sqlite3.connect(cf['global']['database']) as conn: + c = conn.cursor() + c.execute(""" + SELECT video_id,display + FROM flags + WHERE user = ? + AND display IS NOT NULL + AND video_id IN ({}) + -- AND display = 'pinned' + """.format(",".join(["?"]*len(video_ids))), (token,*video_ids)) + flags = c.fetchall() + pinned = [video for video,disp in flags if disp == 'pinned'] + hidden = [video for video,disp in flags if disp == 'hidden'] + + return pinned, hidden + from werkzeug.exceptions import NotFound class NoFallbackException(NotFound): pass def fallback_route(*args, **kwargs): # TODO: worthy as a flask-extension? diff --git a/app/reddit/__init__.py b/app/reddit/__init__.py index 80989db..d5d7c4a 100644 --- a/app/reddit/__init__.py +++ b/app/reddit/__init__.py @@ -36,24 +36,13 @@ def reddit(subreddit=None): return f"error retrieving reddit data: {e}", 502 # TODO: better # set pin/hide stati of retrieved videos - with sqlite3.connect(cf['global']['database']) as conn: - c = conn.cursor() - c.execute(""" - SELECT video_id,display - FROM flags - WHERE user = ? - AND display IS NOT NULL - -- AND display = 'pinned' - """, (token,)) - flags = c.fetchall() - - pinned = [video for video,disp in flags if disp == 'pinned'] - hidden = [video for video,disp in flags if disp == 'hidden'] - videos = sorted([ - {**v, 'pinned': v['video_id'] in pinned} - for v in videos - if v['video_id'] not in hidden - ], key=lambda v:v['pinned'], reverse=True) + video_ids = [v['video_id'] for v in videos] + pinned, hidden = fetch_video_flags(token, video_ids) + videos = sorted([ + {**v, 'pinned': v['video_id'] in pinned} + for v in videos + if v['video_id'] not in hidden + ], key=lambda v:v['pinned'], reverse=True) title = f"/r/{subreddit}" if subreddit else "my subreddits" return render_template('reddit.html.j2', title=title, rows=videos, -- 2.39.3