this repo has no description
1import logging 2 3import apsw 4import apsw.ext 5 6from . import BaseFeed 7 8class 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 )