-2
feed_manager.py
-2
feed_manager.py
···
2
2
3
3
from feeds.battle import BattleFeed
4
4
from feeds.rapidfire import RapidFireFeed
5
-
from feeds.popular import PopularFeed
6
5
from feeds.homeruns import HomeRunsTeamFeed
7
6
from feeds.norazone_interesting import NoraZoneInteresting
8
7
from feeds.sevendirtywords import SevenDirtyWordsFeed
···
52
51
pass
53
52
54
53
feed_manager = FeedManager()
55
-
feed_manager.register(PopularFeed)
-56
feeds/popular.py
-56
feeds/popular.py
···
1
-
import logging
2
-
3
-
import apsw
4
-
import apsw.ext
5
-
6
-
from . import BaseFeed
7
-
8
-
class PopularFeed(BaseFeed):
9
-
FEED_URI = 'at://did:plc:4nsduwlpivpuur4mqkbfvm6a/app.bsky.feed.generator/popular'
10
-
11
-
def __init__(self):
12
-
# use the posts from the most-liked feed for this
13
-
self.db_cnx = apsw.Connection('db/mostliked.db')
14
-
self.db_cnx.pragma('foreign_keys', True)
15
-
self.db_cnx.pragma('journal_mode', 'WAL')
16
-
17
-
def process_commit(self, commit):
18
-
pass
19
-
20
-
def commit_changes(self):
21
-
pass
22
-
23
-
def generate_sql(self, limit, offset, langs):
24
-
bindings = []
25
-
sql = """
26
-
select posts.uri, create_ts, likes, lang, unixepoch('now') - create_ts as age_seconds,
27
-
exp( -1 * ( ( unixepoch('now') - create_ts ) / 1800.0 ) ) as decay,
28
-
likes * exp( -1 * ( ( unixepoch('now') - create_ts ) / 1800.0 ) ) as score
29
-
from posts
30
-
left join langs on posts.uri = langs.uri
31
-
where
32
-
"""
33
-
if not '*' in langs:
34
-
lang_values = list(langs.values())
35
-
bindings.extend(lang_values)
36
-
sql += " OR ".join(['lang = ?'] * len(lang_values))
37
-
else:
38
-
sql += " 1=1 "
39
-
sql += """
40
-
order by score desc
41
-
limit ? offset ?
42
-
"""
43
-
bindings.extend([limit, offset])
44
-
return sql, bindings
45
-
46
-
def serve_feed(self, limit, offset, langs):
47
-
sql, bindings = self.generate_sql(limit, offset, langs)
48
-
cur = self.db_cnx.execute(sql, bindings)
49
-
return [row[0] for row in cur]
50
-
51
-
def serve_feed_debug(self, limit, offset, langs):
52
-
sql, bindings = self.generate_sql(limit, offset, langs)
53
-
return apsw.ext.format_query_table(
54
-
self.db_cnx, sql, bindings,
55
-
string_sanitize=2, text_width=9999, use_unicode=True
56
-
)