this repo has no description
at master 1.7 kB view raw
1package videostream 2 3import ( 4 "context" 5 "database/sql" 6 "log" 7 "strconv" 8 9 appbsky "github.com/bluesky-social/indigo/api/bsky" 10 "github.com/edavis/bsky-feeds/pkg/feeds" 11 _ "github.com/mattn/go-sqlite3" 12) 13 14type PostRow struct { 15 Uri string 16} 17 18func getPosts(ctx context.Context, dbCnx *sql.DB, limit, offset int) ([]PostRow, error) { 19 rows, err := dbCnx.QueryContext(ctx, `select uri from posts where create_ts < unixepoch('now', '-2 minutes') order by create_ts desc limit ? offset ?`, limit, offset) 20 if err != nil { 21 return nil, err 22 } 23 defer rows.Close() 24 25 var posts []PostRow 26 for rows.Next() { 27 var post PostRow 28 if err := rows.Scan(&post.Uri); err != nil { 29 return nil, err 30 } 31 posts = append(posts, post) 32 } 33 return posts, nil 34} 35 36func Feed(params feeds.FeedgenParams) appbsky.FeedGetFeedSkeleton_Output { 37 ctx := context.Background() 38 dbCnx, err := sql.Open("sqlite3", "data/videostream.db?_journal=WAL&_fk=on") 39 if err != nil { 40 log.Printf("error opening db: %v\n", err) 41 } 42 defer dbCnx.Close() 43 44 offset := 0 45 if params.Cursor != "" { 46 if parsed, err := strconv.Atoi(params.Cursor); err == nil { 47 offset = parsed 48 } else { 49 log.Printf("error converting cursor: %v\n", err) 50 } 51 } 52 53 rows, err := getPosts(ctx, dbCnx, params.Limit, offset) 54 if err != nil { 55 log.Printf("error fetching rows: %v\n", err) 56 } 57 58 var cursor string 59 posts := make([]*appbsky.FeedDefs_SkeletonFeedPost, 0, params.Limit) 60 61 for _, row := range rows { 62 posts = append(posts, &appbsky.FeedDefs_SkeletonFeedPost{Post: row.Uri}) 63 } 64 65 skeleton := appbsky.FeedGetFeedSkeleton_Output{ 66 Feed: posts, 67 } 68 69 offset += len(posts) 70 cursor = strconv.Itoa(offset) 71 72 if len(posts) == params.Limit { 73 skeleton.Cursor = &cursor 74 } 75 76 return skeleton 77}