Merge pull request #9023 from internet-development/caidanw/app-1040-feed-open-graph-tags
feat: add feed open graph tags
This commit is contained in:
@@ -313,7 +313,7 @@ func serve(cctx *cli.Context) error {
|
|||||||
e.GET("/profile/:handleOrDID/known-followers", server.WebGeneric)
|
e.GET("/profile/:handleOrDID/known-followers", server.WebGeneric)
|
||||||
e.GET("/profile/:handleOrDID/search", server.WebGeneric)
|
e.GET("/profile/:handleOrDID/search", server.WebGeneric)
|
||||||
e.GET("/profile/:handleOrDID/lists/:rkey", server.WebGeneric)
|
e.GET("/profile/:handleOrDID/lists/:rkey", server.WebGeneric)
|
||||||
e.GET("/profile/:handleOrDID/feed/:rkey", server.WebGeneric)
|
e.GET("/profile/:handleOrDID/feed/:rkey", server.WebFeed)
|
||||||
e.GET("/profile/:handleOrDID/feed/:rkey/liked-by", server.WebGeneric)
|
e.GET("/profile/:handleOrDID/feed/:rkey/liked-by", server.WebGeneric)
|
||||||
e.GET("/profile/:handleOrDID/labeler/liked-by", server.WebGeneric)
|
e.GET("/profile/:handleOrDID/labeler/liked-by", server.WebGeneric)
|
||||||
|
|
||||||
@@ -603,6 +603,57 @@ func (srv *Server) WebProfile(c echo.Context) error {
|
|||||||
return c.Render(http.StatusOK, "profile.html", data)
|
return c.Render(http.StatusOK, "profile.html", data)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (srv *Server) WebFeed(c echo.Context) error {
|
||||||
|
ctx := c.Request().Context()
|
||||||
|
data := srv.NewTemplateContext()
|
||||||
|
|
||||||
|
// sanity check arguments. don't 4xx, just let app handle if not expected format
|
||||||
|
rkeyParam := c.Param("rkey")
|
||||||
|
rkey, err := syntax.ParseRecordKey(rkeyParam)
|
||||||
|
if err != nil {
|
||||||
|
return c.Render(http.StatusOK, "feed.html", data)
|
||||||
|
}
|
||||||
|
handleOrDIDParam := c.Param("handleOrDID")
|
||||||
|
handleOrDID, err := syntax.ParseAtIdentifier(handleOrDIDParam)
|
||||||
|
if err != nil {
|
||||||
|
return c.Render(http.StatusOK, "feed.html", data)
|
||||||
|
}
|
||||||
|
|
||||||
|
identifier := handleOrDID.Normalize().String()
|
||||||
|
|
||||||
|
// requires two fetches: first fetch profile to get DID
|
||||||
|
pv, err := appbsky.ActorGetProfile(ctx, srv.xrpcc, identifier)
|
||||||
|
if err != nil {
|
||||||
|
log.Warnf("failed to fetch profile for: %s\t%v", identifier, err)
|
||||||
|
return c.Render(http.StatusOK, "feed.html", data)
|
||||||
|
}
|
||||||
|
unauthedViewingOkay := true
|
||||||
|
for _, label := range pv.Labels {
|
||||||
|
if label.Src == pv.Did && label.Val == "!no-unauthenticated" {
|
||||||
|
unauthedViewingOkay = false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if !unauthedViewingOkay {
|
||||||
|
return c.Render(http.StatusOK, "feed.html", data)
|
||||||
|
}
|
||||||
|
did := pv.Did
|
||||||
|
data["did"] = did
|
||||||
|
|
||||||
|
// then fetch the feed generator
|
||||||
|
feedURI := fmt.Sprintf("at://%s/app.bsky.feed.generator/%s", did, rkey)
|
||||||
|
fgv, err := appbsky.FeedGetFeedGenerator(ctx, srv.xrpcc, feedURI)
|
||||||
|
if err != nil {
|
||||||
|
log.Warnf("failed to fetch feed generator: %s\t%v", feedURI, err)
|
||||||
|
return c.Render(http.StatusOK, "feed.html", data)
|
||||||
|
}
|
||||||
|
req := c.Request()
|
||||||
|
data["feedView"] = fgv.View
|
||||||
|
data["requestURI"] = fmt.Sprintf("https://%s%s", req.Host, req.URL.Path)
|
||||||
|
|
||||||
|
return c.Render(http.StatusOK, "feed.html", data)
|
||||||
|
}
|
||||||
|
|
||||||
type IPCCRequest struct {
|
type IPCCRequest struct {
|
||||||
IP string `json:"ip"`
|
IP string `json:"ip"`
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,54 @@
|
|||||||
|
{% extends "base.html" %}
|
||||||
|
|
||||||
|
{% block head_title %}
|
||||||
|
{%- if feedView -%}
|
||||||
|
{{ feedView.DisplayName }} by @{{ feedView.Creator.Handle }} | Bluesky Feed
|
||||||
|
{%- else -%}
|
||||||
|
Bluesky
|
||||||
|
{%- endif -%}
|
||||||
|
{% endblock %}
|
||||||
|
|
||||||
|
{% block html_head_extra -%}
|
||||||
|
{%- if feedView -%}
|
||||||
|
<meta property="og:site_name" content="Bluesky Social">
|
||||||
|
<meta property="og:type" content="website">
|
||||||
|
{%- if requestURI %}
|
||||||
|
<meta property="og:url" content="{{ requestURI }}">
|
||||||
|
<link rel="canonical" href="{{ requestURI|canonicalize_url }}" />
|
||||||
|
{% endif -%}
|
||||||
|
|
||||||
|
{%- if feedView.DisplayName %}
|
||||||
|
<meta property="og:title" content="{{ feedView.DisplayName }} by @{{ feedView.Creator.Handle }}">
|
||||||
|
{% else %}
|
||||||
|
<meta property="og:title" content="Feed by @{{ feedView.Creator.Handle }}">
|
||||||
|
{% endif -%}
|
||||||
|
|
||||||
|
{%- if feedView.Description %}
|
||||||
|
<meta name="description" content="{{ feedView.Description }}">
|
||||||
|
<meta property="og:description" content="{{ feedView.Description }}">
|
||||||
|
<meta property="twitter:description" content="{{ feedView.Description }}">
|
||||||
|
{% endif -%}
|
||||||
|
|
||||||
|
{%- if feedView.Avatar %}
|
||||||
|
<meta property="og:image" content="{{ feedView.Avatar }}">
|
||||||
|
<meta property="twitter:image" content="{{ feedView.Avatar }}">
|
||||||
|
<meta name="twitter:card" content="summary">
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
<meta name="twitter:label1" content="Created by">
|
||||||
|
<meta name="twitter:value1" content="@{{ feedView.Creator.Handle }}">
|
||||||
|
|
||||||
|
<link rel="alternate" href="{{ feedView.Uri }}" />
|
||||||
|
{% endif -%}
|
||||||
|
{%- endblock %}
|
||||||
|
|
||||||
|
{% block noscript_extra -%}
|
||||||
|
{%- if feedView -%}
|
||||||
|
<div id="bsky_feed_summary">
|
||||||
|
<h3>Feed</h3>
|
||||||
|
<p id="bsky_feed_name">{{ feedView.DisplayName }}</p>
|
||||||
|
<p id="bsky_feed_creator">{{ feedView.Creator.Handle }}</p>
|
||||||
|
<p id="bsky_feed_description">{{ feedView.Description }}</p>
|
||||||
|
</div>
|
||||||
|
{% endif -%}
|
||||||
|
{%- endblock %}
|
||||||
Reference in New Issue
Block a user