server/opengraph: add remaining post tags
This commit is contained in:
parent
fff0999e6a
commit
299ebfc4c8
2 changed files with 83 additions and 13 deletions
|
@ -145,22 +145,44 @@ def get_post_html(
|
|||
) -> rest.Response:
|
||||
try:
|
||||
post = _get_post(params)
|
||||
title = f"Post {_get_post_id(params)} - {config.config['name']}"
|
||||
title = f"{config.config['name']} - post {_get_post_id(params)}"
|
||||
except posts.InvalidPostIdError:
|
||||
# Return the default template and let the browser JS handle the 404
|
||||
return _get_html_template()
|
||||
|
||||
metadata = {
|
||||
"og:site_name": config.config["name"],
|
||||
"og:type": "image",
|
||||
"og:title": title,
|
||||
"og:url": f"{ctx.url_prefix}/post/{params['post_id']}",
|
||||
"og:title": title,
|
||||
"twitter:title": title,
|
||||
"og:type": "article",
|
||||
}
|
||||
# Note: ctx.user will always be the anonymous user
|
||||
if auth.has_privilege(ctx.user, "posts:view"):
|
||||
# TODO: Host Header and Proxy Prefix
|
||||
metadata["og:image"] = posts.get_post_content_url(post)
|
||||
|
||||
metadata["og:article:published_time"] = post.creation_time.isoformat()
|
||||
if post.last_edit_time:
|
||||
metadata[
|
||||
"og:article:modified_time"
|
||||
] = post.last_edit_time.isoformat()
|
||||
metadata["og:image:alt"] = " ".join(
|
||||
tag.first_name for tag in post.tags
|
||||
)
|
||||
if post.type in (model.Post.TYPE_VIDEO):
|
||||
metadata["twitter:card"] = "player"
|
||||
metadata["og:video:url"] = posts.get_post_content_url(post)
|
||||
metadata["twitter:player:stream"] = posts.get_post_content_url(
|
||||
post
|
||||
)
|
||||
metadata["og:image:url"] = posts.get_post_thumbnail_url(post)
|
||||
if post.canvas_width and post.canvas_height:
|
||||
metadata["og:video:width"] = str(post.canvas_width)
|
||||
metadata["og:video:height"] = str(post.canvas_height)
|
||||
metadata["twitter:player:width"] = str(post.canvas_width)
|
||||
metadata["twitter:player:height"] = str(post.canvas_height)
|
||||
else:
|
||||
metadata["twitter:card"] = "summary_large_image"
|
||||
metadata["og:image:url"] = posts.get_post_content_url(post)
|
||||
metadata["twitter:image"] = posts.get_post_content_url(post)
|
||||
return _get_html_template(
|
||||
meta_tags=metadata, title=title, prefix=ctx.url_prefix
|
||||
)
|
||||
|
|
|
@ -3,7 +3,7 @@ from unittest.mock import patch
|
|||
import pytest
|
||||
import yattag
|
||||
|
||||
from szurubooru import api, db
|
||||
from szurubooru import api, db, model
|
||||
from szurubooru.func import auth, posts
|
||||
|
||||
|
||||
|
@ -14,8 +14,11 @@ def _make_meta_tag(name, content):
|
|||
|
||||
|
||||
@pytest.mark.parametrize("view_priv", [True, False])
|
||||
@pytest.mark.parametrize(
|
||||
"post_type", [model.Post.TYPE_IMAGE, model.Post.TYPE_VIDEO]
|
||||
)
|
||||
def test_get_post_html(
|
||||
config_injector, context_factory, post_factory, view_priv
|
||||
config_injector, context_factory, post_factory, view_priv, post_type
|
||||
):
|
||||
config_injector(
|
||||
{
|
||||
|
@ -25,16 +28,61 @@ def test_get_post_html(
|
|||
)
|
||||
ctx = context_factory()
|
||||
ctx.url_prefix = "/someprefix"
|
||||
db.session.add(post_factory(id=1))
|
||||
post = post_factory(id=1, type=post_type)
|
||||
post.canvas_width = 1920
|
||||
post.canvas_height = 1080
|
||||
db.session.add(post)
|
||||
db.session.flush()
|
||||
with patch("szurubooru.func.auth.has_privilege"), patch(
|
||||
"szurubooru.func.posts.get_post_content_url"
|
||||
):
|
||||
), patch("szurubooru.func.posts.get_post_thumbnail_url"):
|
||||
auth.has_privilege.return_value = view_priv
|
||||
posts.get_post_content_url.return_value = "/content-url"
|
||||
posts.get_post_thumbnail_url.return_value = "/thumbnail-url"
|
||||
ret = api.opengraph_api.get_post_html(ctx, {"post_id": 1})
|
||||
|
||||
assert _make_meta_tag("og:site_name", "test installation") in ret
|
||||
assert _make_meta_tag("og:title", "Post 1 - test installation") in ret
|
||||
if view_priv:
|
||||
assert _make_meta_tag("og:image", "/content-url") in ret
|
||||
assert _make_meta_tag("og:url", "/someprefix/post/1") in ret
|
||||
assert _make_meta_tag("og:title", "test installation - post 1") in ret
|
||||
assert _make_meta_tag("twitter:title", "test installation - post 1") in ret
|
||||
assert _make_meta_tag("og:type", "article") in ret
|
||||
assert (
|
||||
bool(
|
||||
_make_meta_tag("og:article:published_time", "1996-01-01T00:00:00")
|
||||
in ret
|
||||
)
|
||||
== view_priv
|
||||
)
|
||||
if post_type == model.Post.TYPE_VIDEO:
|
||||
assert (
|
||||
bool(_make_meta_tag("twitter:card", "player") in ret) == view_priv
|
||||
)
|
||||
assert (
|
||||
bool(
|
||||
_make_meta_tag("twitter:player:stream", "/content-url") in ret
|
||||
)
|
||||
== view_priv
|
||||
)
|
||||
assert (
|
||||
bool(_make_meta_tag("og:video:url", "/content-url") in ret)
|
||||
== view_priv
|
||||
)
|
||||
assert (
|
||||
bool(_make_meta_tag("og:image:url", "/thumbnail-url") in ret)
|
||||
== view_priv
|
||||
)
|
||||
assert (
|
||||
bool(_make_meta_tag("og:video:width", "1920") in ret) == view_priv
|
||||
)
|
||||
assert (
|
||||
bool(_make_meta_tag("og:video:height", "1080") in ret) == view_priv
|
||||
)
|
||||
else:
|
||||
assert (
|
||||
bool(_make_meta_tag("twitter:card", "summary_large_image") in ret)
|
||||
== view_priv
|
||||
)
|
||||
assert (
|
||||
bool(_make_meta_tag("twitter:image", "/content-url") in ret)
|
||||
== view_priv
|
||||
)
|
||||
|
|
Loading…
Reference in a new issue