diff options
author | Caidan <caidan@internet.dev> | 2025-09-17 14:30:10 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2025-09-17 14:30:10 -0700 |
commit | ac71ea235f27234a34e5005af03935f80a9d1092 (patch) | |
tree | afb869bbcc6f4313e2ce7942c016d40c4a726d52 | |
parent | 5e78c947a0853792900f76d17bd9468983ad51b6 (diff) | |
download | voidsky-ac71ea235f27234a34e5005af03935f80a9d1092.tar.zst |
improve: enhance post OpenGraph metadata with engagement data and auth handling (#9046)
-rw-r--r-- | bskyweb/cmd/bskyweb/server.go | 14 | ||||
-rw-r--r-- | bskyweb/templates/base.html | 2 | ||||
-rw-r--r-- | bskyweb/templates/post.html | 45 |
3 files changed, 51 insertions, 10 deletions
diff --git a/bskyweb/cmd/bskyweb/server.go b/bskyweb/cmd/bskyweb/server.go index 8d75bb6ef..672e8d25e 100644 --- a/bskyweb/cmd/bskyweb/server.go +++ b/bskyweb/cmd/bskyweb/server.go @@ -488,20 +488,26 @@ func (srv *Server) WebPost(c echo.Context) error { } } + req := c.Request() if !unauthedViewingOkay { + // Provide minimal OpenGraph data for auth-required posts + data["requestURI"] = fmt.Sprintf("https://%s%s", req.Host, req.URL.Path) + data["requiresAuth"] = true + data["profileHandle"] = pv.Handle + if pv.DisplayName != nil { + data["profileDisplayName"] = *pv.DisplayName + } return c.Render(http.StatusOK, "post.html", data) } - did := pv.Did - data["did"] = did // then fetch the post thread (with extra context) - uri := fmt.Sprintf("at://%s/app.bsky.feed.post/%s", did, rkey) + uri := fmt.Sprintf("at://%s/app.bsky.feed.post/%s", pv.Did, rkey) tpv, err := appbsky.FeedGetPostThread(ctx, srv.xrpcc, 1, 0, uri) if err != nil { log.Warnf("failed to fetch post: %s\t%v", uri, err) return c.Render(http.StatusOK, "post.html", data) } - req := c.Request() + postView := tpv.Thread.FeedDefs_ThreadViewPost.Post data["postView"] = postView data["requestURI"] = fmt.Sprintf("https://%s%s", req.Host, req.URL.Path) diff --git a/bskyweb/templates/base.html b/bskyweb/templates/base.html index 715b39fd2..c8dec0e22 100644 --- a/bskyweb/templates/base.html +++ b/bskyweb/templates/base.html @@ -94,7 +94,7 @@ <meta name="theme-color"> <meta name="application-name" content="Bluesky"> <meta name="generator" content="bskyweb"> - <meta property="og:site_name" content="Bluesky Social" /> + <meta property="og:site_name" content="Bluesky Social"> <meta name="twitter:site" content="@bluesky" /> <link type="application/activity+json" href="" /> diff --git a/bskyweb/templates/post.html b/bskyweb/templates/post.html index 6473bc284..983f84535 100644 --- a/bskyweb/templates/post.html +++ b/bskyweb/templates/post.html @@ -3,6 +3,8 @@ {% block head_title %} {%- if postView -%} @{{ postView.Author.Handle }} on Bluesky +{%- elif requiresAuth and profileHandle -%} + @{{ profileHandle }} on Bluesky {%- else -%} Bluesky {%- endif -%} @@ -11,7 +13,7 @@ {% block html_head_extra -%} {%- if postView -%} <meta property="og:type" content="article"> - <meta property="profile:username" content="{{ profileView.Handle }}"> + <meta property="profile:username" content="{{ postView.Author.Handle }}"> {%- if requestURI %} <meta property="og:url" content="{{ requestURI }}"> <link rel="canonical" href="{{ requestURI|canonicalize_url }}" /> @@ -32,17 +34,44 @@ <meta property="twitter:image" content="{{ imgThumbUrl }}"> {% endfor %} <meta name="twitter:card" content="summary_large_image"> - {%- elif postView.Author.Avatar %} - <meta name="twitter:card" content="summary"> + {% else %} <meta property="og:image" content="{{ postView.Author.Avatar }}"> <meta property="twitter:image" content="{{ postView.Author.Avatar }}"> + <meta name="twitter:card" content="summary"> {% endif %} <meta name="twitter:label1" content="Posted At"> <meta name="twitter:value1" content="{{ postView.IndexedAt }}"> - <meta name="article:published_time" content="{{ postView.IndexedAt }}"> - <meta name="article:published_time" content="{{ postView.IndexedAt }}"> + {%- if postView.LikeCount %} + <meta name="twitter:label2" content="Likes"> + <meta name="twitter:value2" content="{{ postView.LikeCount }}"> + {% endif -%} + {%- if postView.ReplyCount %} + <meta name="twitter:label3" content="Replies"> + <meta name="twitter:value3" content="{{ postView.ReplyCount }}"> + {% endif -%} + {%- if postView.RepostCount %} + <meta name="twitter:label4" content="Reposts"> + <meta name="twitter:value4" content="{{ postView.RepostCount }}"> + {% endif -%} + <meta property="article:published_time" content="{{ postView.IndexedAt }}"> <link rel="alternate" type="application/json+oembed" href="https://embed.bsky.app/oembed?format=json&url={{ postView.Uri | urlencode }}" /> <link rel="alternate" href="{{ postView.Uri }}" /> +{%- elif requiresAuth and profileHandle -%} + <meta property="og:type" content="article"> + <meta property="profile:username" content="{{ profileHandle }}"> + {%- if requestURI %} + <meta property="og:url" content="{{ requestURI }}"> + <link rel="canonical" href="{{ requestURI|canonicalize_url }}" /> + {% endif -%} + {%- if profileDisplayName %} + <meta property="og:title" content="{{ profileDisplayName }} (@{{ profileHandle }})"> + {% else %} + <meta property="og:title" content="@{{ profileHandle }}"> + {% endif -%} + <meta name="description" content="This post requires authentication to view."> + <meta property="og:description" content="This post requires authentication to view."> + <meta property="twitter:description" content="This post requires authentication to view."> + <meta name="twitter:card" content="summary"> {% endif -%} {%- endblock %} @@ -56,5 +85,11 @@ <p id="bsky_post_text">{{ postText }}</p> <p id="bsky_post_indexedat">{{ postView.IndexedAt }}</p> </div> +{%- elif requiresAuth and profileHandle -%} +<div id="bsky_post_summary"> + <h3>Post</h3> + <p id="bsky_handle">{{ profileHandle }}</p> + <p id="bsky_post_text">This post requires authentication to view.</p> +</div> {% endif -%} {%- endblock %} |