this repo has no description
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}