this repo has no description

feat: add videostream generator

Eric Davis cd0afaa0 48e33e9d

Changed files
+81 -2
cmd
feedweb
pkg
videostream
+2 -2
Makefile
···
bin/videostream: cmd/videostream/*.go pkg/videostream/*.go
go build -o $@ ./cmd/videostream
-
bin/mostliked: cmd/mostliked/main.go pkg/mostliked/handler.go db/mostliked/*.go pkg/feeds/*.go
+
bin/mostliked: cmd/mostliked/*.go pkg/mostliked/*.go
go build -o $@ ./cmd/mostliked
-
bin/feedweb: cmd/feedweb/*.go pkg/*/generator.go db/*/*.go pkg/feeds/*.go
+
bin/feedweb:
go build -o $@ ./cmd/feedweb
.PHONY: clean
+3
cmd/feedweb/main.go
···
"github.com/edavis/bsky-feeds/pkg/feeds"
"github.com/edavis/bsky-feeds/pkg/mostliked"
"github.com/edavis/bsky-feeds/pkg/popular"
+
"github.com/edavis/bsky-feeds/pkg/videostream"
"github.com/labstack/echo/v4"
"github.com/labstack/echo/v4/middleware"
sqlite "github.com/mattn/go-sqlite3"
···
"at://did:plc:4nsduwlpivpuur4mqkbfvm6a/app.bsky.feed.generator/popular": popular.Feed,
"at://did:plc:4nsduwlpivpuur4mqkbfvm6a/app.bsky.feed.generator/popular-dev": popular.Feed,
+
+
"at://did:plc:4nsduwlpivpuur4mqkbfvm6a/app.bsky.feed.generator/videostream": videostream.Feed,
}
func getFeedSkeleton(c echo.Context) error {
+76
pkg/videostream/generator.go
···
package videostream
+
+
import (
+
"context"
+
"database/sql"
+
"log"
+
"strconv"
+
+
appbsky "github.com/bluesky-social/indigo/api/bsky"
+
"github.com/edavis/bsky-feeds/pkg/feeds"
+
_ "github.com/mattn/go-sqlite3"
+
)
+
+
type PostRow struct {
+
Uri string
+
}
+
+
func getPosts(ctx context.Context, dbCnx *sql.DB, limit, offset int) ([]PostRow, error) {
+
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)
+
if err != nil {
+
return nil, err
+
}
+
defer rows.Close()
+
+
var posts []PostRow
+
for rows.Next() {
+
var post PostRow
+
if err := rows.Scan(&post.Uri); err != nil {
+
return nil, err
+
}
+
posts = append(posts, post)
+
}
+
return posts, nil
+
}
+
+
func Feed(params feeds.FeedgenParams) appbsky.FeedGetFeedSkeleton_Output {
+
ctx := context.Background()
+
dbCnx, err := sql.Open("sqlite3", "data/videostream.db?_journal=WAL&_fk=on")
+
if err != nil {
+
log.Printf("error opening db: %v\n", err)
+
}
+
defer dbCnx.Close()
+
+
offset := 0
+
if params.Cursor != "" {
+
if parsed, err := strconv.Atoi(params.Cursor); err == nil {
+
offset = parsed
+
} else {
+
log.Printf("error converting cursor: %v\n", err)
+
}
+
}
+
+
rows, err := getPosts(ctx, dbCnx, params.Limit, offset)
+
if err != nil {
+
log.Printf("error fetching rows: %v\n", err)
+
}
+
+
var cursor string
+
posts := make([]*appbsky.FeedDefs_SkeletonFeedPost, 0, params.Limit)
+
+
for _, row := range rows {
+
posts = append(posts, &appbsky.FeedDefs_SkeletonFeedPost{Post: row.Uri})
+
}
+
+
skeleton := appbsky.FeedGetFeedSkeleton_Output{
+
Feed: posts,
+
}
+
+
offset += len(posts)
+
cursor = strconv.Itoa(offset)
+
+
if len(posts) == params.Limit {
+
skeleton.Cursor = &cursor
+
}
+
+
return skeleton
+
}