diff --git a/client/metatags.lua b/client/metatags.lua index 6826a13e..aa6839b1 100644 --- a/client/metatags.lua +++ b/client/metatags.lua @@ -41,81 +41,88 @@ end add_meta_tag("og:site_name", server_info.config.name) add_meta_tag("og:url", ngx.var.external_host_url .. ngx.var.request_uri_path) -if ngx.var.request_uri_path:match('^/$') then -- Site root - add_meta_tag("og:type", "website") - add_meta_tag("og:title", server_info.config.name) - add_meta_tag("twitter:title", server_info.config.name) - -- if there's a featured post, let's use that as the image - if server_info.featuredPost then - local post_info = server_info.featuredPost - -- NOTE this is different from the normal Post tags, - -- notably we avoid setting the article type, author, time, etc - local og_media_prefix - if post_info.type == "image" then - og_media_prefix = "og:image" - add_meta_tag("twitter:card", "summary_large_image") - add_meta_tag("twitter:image", ngx.var.external_host_url .. '/' .. post_info.contentUrl) - elseif post_info.type == "video" then - og_media_prefix = "og:video" - -- some sites don't preview video, so at least provide a thumbnail - add_meta_tag("og:image", ngx.var.external_host_url .. '/' .. post_info.thumbnailUrl) +local function generate_meta_tags () + if ngx.var.request_uri_path:match('^/$') then -- Site root + add_meta_tag("og:type", "website") + add_meta_tag("og:title", server_info.config.name) + add_meta_tag("twitter:title", server_info.config.name) + -- if there's a featured post, let's use that as the image + if server_info.featuredPost then + local post_info = server_info.featuredPost + -- NOTE this is different from the normal Post tags, + -- notably we avoid setting the article type, author, time, etc + local og_media_prefix + if post_info.type == "image" then + og_media_prefix = "og:image" + add_meta_tag("twitter:card", "summary_large_image") + add_meta_tag("twitter:image", ngx.var.external_host_url .. '/' .. post_info.contentUrl) + elseif post_info.type == "video" then + og_media_prefix = "og:video" + -- some sites don't preview video, so at least provide a thumbnail + add_meta_tag("og:image", ngx.var.external_host_url .. '/' .. post_info.thumbnailUrl) + end + add_meta_tag(og_media_prefix..":url", ngx.var.external_host_url .. '/' .. post_info.contentUrl) + add_meta_tag(og_media_prefix..":width", post_info.canvasWidth) + add_meta_tag(og_media_prefix..":height", post_info.canvasHeight) end - add_meta_tag(og_media_prefix..":url", ngx.var.external_host_url .. '/' .. post_info.contentUrl) - add_meta_tag(og_media_prefix..":width", post_info.canvasWidth) - add_meta_tag(og_media_prefix..":height", post_info.canvasHeight) - end -elseif ngx.var.request_uri_path:match('^/post/([0-9]+)/?$') then -- Post metadata - -- check if posts are accessible to anonymous users: - if server_info.config.privileges["posts:view"] == "anonymous" then - add_meta_tag("og:type", "article") - local post_info = cjson.decode((ngx.location.capture("/_internal_api"..ngx.var.request_uri_path)).body) - add_meta_tag("og:title", server_info.config.name .. " - Post " .. post_info.id) - add_meta_tag("twitter:title", server_info.config.name .. " - Post " .. post_info.id) - add_meta_tag("article:published_time", post_info.creationTime) - local og_media_prefix - if post_info.type == "image" then - og_media_prefix = "og:image" - add_meta_tag("twitter:card", "summary_large_image") - add_meta_tag("twitter:image", ngx.var.external_host_url .. '/' .. post_info.contentUrl) - elseif post_info.type == "video" then - og_media_prefix = "og:video" - add_meta_tag("twitter:card", "player") - add_meta_tag("twitter:player:width", post_info.canvasWidth) - add_meta_tag("twitter:player:height", post_info.canvasHeight) - -- some sites don't preview video, so at least provide a thumbnail - add_meta_tag("og:image", ngx.var.external_host_url .. '/' .. post_info.thumbnailUrl) - end - add_meta_tag(og_media_prefix..":url", ngx.var.external_host_url .. '/' .. post_info.contentUrl) - add_meta_tag(og_media_prefix..":width", post_info.canvasWidth) - add_meta_tag(og_media_prefix..":height", post_info.canvasHeight) - -- user is not present for anonymous uploads: - if post_info.user then - add_meta_tag("article:author", post_info.user.name) - end - else - -- no permission to retrieve post data - add_meta_tag("og:title", server_info.config.name .. " - Login required") - end -elseif ngx.var.request_uri_path:match('^/user/([^/]+)/?$') then -- User metadata - local username = ngx.var.request_uri_path:match('^/user/([^/]+)/?$') - add_meta_tag("og:title", server_info.config.name .. " - " .. username) - add_meta_tag("og:type", "profile") - -- check for permission to access user profiles - if server_info.config.privileges["users:view"] == "anonymous" then - local user_info = cjson.decode((ngx.location.capture("/_internal_api/user/"..username)).body) - add_meta_tag("profile:username", user_info.name) - local avatar_url - avatar_url = user_info.avatarUrl - if avatar_url:match("^https?://") then - add_meta_tag("og:image", avatar_url) + elseif ngx.var.request_uri_path:match('^/post/([0-9]+)/?$') then -- Post metadata + -- check if posts are accessible to anonymous users: + if server_info.config.privileges["posts:view"] == "anonymous" then + add_meta_tag("og:type", "article") + local post_info = cjson.decode((ngx.location.capture("/_internal_api"..ngx.var.request_uri_path)).body) + add_meta_tag("og:title", server_info.config.name .. " - Post " .. post_info.id) + add_meta_tag("twitter:title", server_info.config.name .. " - Post " .. post_info.id) + add_meta_tag("article:published_time", post_info.creationTime) + local og_media_prefix + if post_info.type == "video" then + og_media_prefix = "og:video" + add_meta_tag("twitter:card", "player") + add_meta_tag("twitter:player:width", post_info.canvasWidth) + add_meta_tag("twitter:player:height", post_info.canvasHeight) + -- some sites don't preview video, so at least provide a thumbnail + add_meta_tag("og:image", ngx.var.external_host_url .. '/' .. post_info.thumbnailUrl) + else + og_media_prefix = "og:image" + add_meta_tag("twitter:card", "summary_large_image") + add_meta_tag("twitter:image", ngx.var.external_host_url .. '/' .. post_info.contentUrl) + end + add_meta_tag(og_media_prefix..":url", ngx.var.external_host_url .. '/' .. post_info.contentUrl) + add_meta_tag(og_media_prefix..":width", post_info.canvasWidth) + add_meta_tag(og_media_prefix..":height", post_info.canvasHeight) + -- user is not present for anonymous uploads: + if post_info.user then + add_meta_tag("article:author", post_info.user.name) + end else - add_meta_tag("og:image", ngx.var.external_host_url .. '/' .. avatar_url) + -- no permission to retrieve post data + add_meta_tag("og:title", server_info.config.name .. " - Login required") + end + elseif ngx.var.request_uri_path:match('^/user/([^/]+)/?$') then -- User metadata + local username = ngx.var.request_uri_path:match('^/user/([^/]+)/?$') + add_meta_tag("og:title", server_info.config.name .. " - " .. username) + add_meta_tag("og:type", "profile") + -- check for permission to access user profiles + if server_info.config.privileges["users:view"] == "anonymous" then + local user_info = cjson.decode((ngx.location.capture("/_internal_api/user/"..username)).body) + add_meta_tag("profile:username", user_info.name) + local avatar_url + avatar_url = user_info.avatarUrl + if avatar_url:match("^https?://") then + add_meta_tag("og:image", avatar_url) + else + add_meta_tag("og:image", ngx.var.external_host_url .. '/' .. avatar_url) + end + else + -- no permission to view user data end - else - -- no permission to view user data end end +local status, err = pcall(generate_meta_tags) +if not status then + ngx.log(ngx.STDERR, "Failed to generate meta tags: "..tostring(err)) +end + -- Once tags have been generated, write them and then finish the response ngx.print(additional_tags) ngx.print(after_content)