rebased embedr (#3511)

* skeleton of embedr service, based on bskyweb

* embedr container setup

* builds on this branch

* actual routes

* fix embedr go:embed

* tweak embedr dockerfile

* progress on embedr

* fix path params

* tweaks to build process

* try to get embedr dockerfile to install embed deps

* build this branch

* updates to match sam's output HTML

* try to unbreak embedr dockerfile

* small embedr tweak

* docker hack

* get embed.js copied over to embedr

* don't x-frame-options for embed.bsky.app

* bskyembed: remove a console.log

* use html/template for golang snippet generation

* simplify embedr API fetches

* missing file

* Rm console.log fully

---------

Co-authored-by: Dan Abramov <dan.abramov@gmail.com>
This commit is contained in:
bnewbold 2024-04-13 12:20:06 -07:00 committed by GitHub
parent 196dd3a8ab
commit 58842d03a9
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
30 changed files with 912 additions and 42 deletions

View file

@ -0,0 +1,71 @@
package main
import (
"bytes"
"fmt"
"html/template"
appbsky "github.com/bluesky-social/indigo/api/bsky"
"github.com/bluesky-social/indigo/atproto/syntax"
)
func (srv *Server) postEmbedHTML(postView *appbsky.FeedDefs_PostView) (string, error) {
// ensure that there isn't an injection from the URI
aturi, err := syntax.ParseATURI(postView.Uri)
if err != nil {
log.Error("bad AT-URI in reponse", "aturi", aturi, "err", err)
return "", err
}
post, ok := postView.Record.Val.(*appbsky.FeedPost)
if !ok {
log.Error("bad post record value", "err", err)
return "", err
}
const tpl = `<blockquote class="bluesky-embed" data-bluesky-uri="{{ .PostURI }}" data-bluesky-cid="{{ .PostCID }}"><p{{ if .PostLang }} lang="{{ .PostLang }}"{{ end }}>{{ .PostText }}</p>&mdash; {{ .PostAuthor }} {{ .PostIndexedAt }}</blockquote><script async src="{{ .WidgetURL }}" charset="utf-8"></script>`
t, err := template.New("snippet").Parse(tpl)
if err != nil {
log.Error("template parse error", "err", err)
return "", err
}
var lang string
if len(post.Langs) > 0 {
lang = post.Langs[0]
}
var authorName string
if postView.Author.DisplayName != nil {
authorName = fmt.Sprintf("%s (@%s)", *postView.Author.DisplayName, postView.Author.Handle)
} else {
authorName = fmt.Sprintf("@%s", postView.Author.Handle)
}
fmt.Println(postView.Uri)
fmt.Println(fmt.Sprintf("%s", postView.Uri))
data := struct {
PostURI template.URL
PostCID string
PostLang string
PostText string
PostAuthor string
PostIndexedAt string
WidgetURL template.URL
}{
PostURI: template.URL(postView.Uri),
PostCID: postView.Cid,
PostLang: lang,
PostText: post.Text,
PostAuthor: authorName,
PostIndexedAt: postView.IndexedAt, // TODO: createdAt?
WidgetURL: template.URL("https://embed.bsky.app/static/embed.js"),
}
var buf bytes.Buffer
err = t.Execute(&buf, data)
if err != nil {
log.Error("template parse error", "err", err)
return "", err
}
return buf.String(), nil
}