this repo has no description
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

Add PopularFeed

+53
+2
feedgen.py
··· 10 10 11 11 from feeds import Manager 12 12 from feeds.rapidfire import RapidFireFeed 13 + from feeds.popular import PopularFeed 13 14 14 15 async def firehose_events(): 15 16 redis_cnx = redis.Redis() ··· 54 55 async def main(): 55 56 manager = Manager() 56 57 manager.register(RapidFireFeed) 58 + manager.register(PopularFeed) 57 59 58 60 async for commit in firehose_events(): 59 61 manager.process(commit)
+49
feeds/popular.py
··· 1 + import math 2 + import sqlite3 3 + 4 + class PopularFeed: 5 + FEED_URI = 'at://did:plc:4nsduwlpivpuur4mqkbfvm6a/app.bsky.feed.generator/popular' 6 + 7 + def __init__(self): 8 + self.checkpoint = 0 9 + self.db_cnx = sqlite3.connect('db/popular.db') 10 + self.db_cnx.create_function('exp', 1, math.exp) 11 + with self.db_cnx: 12 + self.db_cnx.executescript( 13 + "pragma journal_mode = WAL;" 14 + "pragma synchronous = off;" 15 + "create table if not exists posts (uri text, create_ts timestamp, update_ts timestamp, temperature int);" 16 + "create unique index if not exists uri_idx on posts(uri);" 17 + ) 18 + 19 + def process(self, commit): 20 + op = commit['op'] 21 + if op['action'] != 'create': 22 + return 23 + 24 + collection, _ = op['path'].split('/') 25 + if collection != 'app.bsky.feed.like': 26 + return 27 + 28 + ts = commit['time'] 29 + like_subject = op['record']['subject']['uri'] 30 + 31 + self.db_cnx.execute(( 32 + "insert into posts (uri, create_ts, update_ts, temperature) " 33 + "values (:uri, :ts, :ts, 1) " 34 + "on conflict (uri) do update set temperature = temperature + 1, update_ts = :ts" 35 + ), dict(uri=like_subject, ts=ts)) 36 + 37 + self.checkpoint += 1 38 + if self.checkpoint % 100 == 0: 39 + self.db_cnx.execute("delete from posts where strftime('%s', create_ts) < strftime('%s', 'now', '-3 hours')") 40 + self.db_cnx.commit() 41 + 42 + def serve(self, limit, offset): 43 + cur = self.db_cnx.execute(( 44 + "select uri from posts " 45 + "order by temperature * exp( " 46 + "-1 * ( ( strftime( '%s', 'now' ) - strftime( '%s', create_ts ) ) / 1800.0 ) " 47 + ") desc limit :limit offset :offset" 48 + ), dict(limit=limit, offset=offset)) 49 + return [uri for (uri,) in cur]
+2
feedweb.py
··· 2 2 3 3 from feeds import Manager 4 4 from feeds.rapidfire import RapidFireFeed 5 + from feeds.popular import PopularFeed 5 6 from flask import Flask, request 6 7 7 8 app = Flask(__name__) ··· 23 24 def get_feed_skeleton(): 24 25 manager = Manager() 25 26 manager.register(RapidFireFeed) 27 + manager.register(PopularFeed) 26 28 27 29 try: 28 30 limit = int(request.args.get('limit', 50))