forked from AkkomaGang/akkoma
Merge branch 'rich_media_titles_two' into 'develop'
Rich media titles two See merge request pleroma/pleroma!1325
This commit is contained in:
commit
27b9605de0
4 changed files with 1551 additions and 8 deletions
|
@ -1,15 +1,19 @@
|
||||||
defmodule Pleroma.Web.RichMedia.Parsers.MetaTagsParser do
|
defmodule Pleroma.Web.RichMedia.Parsers.MetaTagsParser do
|
||||||
def parse(html, data, prefix, error_message, key_name, value_name \\ "content") do
|
def parse(html, data, prefix, error_message, key_name, value_name \\ "content") do
|
||||||
with elements = [_ | _] <- get_elements(html, key_name, prefix),
|
meta_data =
|
||||||
meta_data =
|
html
|
||||||
Enum.reduce(elements, data, fn el, acc ->
|
|> get_elements(key_name, prefix)
|
||||||
attributes = normalize_attributes(el, prefix, key_name, value_name)
|
|> Enum.reduce(data, fn el, acc ->
|
||||||
|
attributes = normalize_attributes(el, prefix, key_name, value_name)
|
||||||
|
|
||||||
Map.merge(acc, attributes)
|
Map.merge(acc, attributes)
|
||||||
end) do
|
end)
|
||||||
{:ok, meta_data}
|
|> maybe_put_title(html)
|
||||||
|
|
||||||
|
if Enum.empty?(meta_data) do
|
||||||
|
{:error, error_message}
|
||||||
else
|
else
|
||||||
_e -> {:error, error_message}
|
{:ok, meta_data}
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -27,4 +31,19 @@ defp normalize_attributes(html_node, prefix, key_name, value_name) do
|
||||||
|
|
||||||
%{String.to_atom(data[key_name]) => data[value_name]}
|
%{String.to_atom(data[key_name]) => data[value_name]}
|
||||||
end
|
end
|
||||||
|
|
||||||
|
defp maybe_put_title(%{title: _} = meta, _), do: meta
|
||||||
|
|
||||||
|
defp maybe_put_title(meta, html) when meta != %{} do
|
||||||
|
case get_page_title(html) do
|
||||||
|
"" -> meta
|
||||||
|
title -> Map.put_new(meta, :title, title)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
defp maybe_put_title(meta, _), do: meta
|
||||||
|
|
||||||
|
defp get_page_title(html) do
|
||||||
|
Floki.find(html, "title") |> Floki.text()
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
1479
test/fixtures/rich_media/non_ogp_embed.html
vendored
Normal file
1479
test/fixtures/rich_media/non_ogp_embed.html
vendored
Normal file
File diff suppressed because it is too large
Load diff
12
test/fixtures/rich_media/ogp-missing-title.html
vendored
Normal file
12
test/fixtures/rich_media/ogp-missing-title.html
vendored
Normal file
|
@ -0,0 +1,12 @@
|
||||||
|
<html prefix="og: http://ogp.me/ns#">
|
||||||
|
|
||||||
|
<head>
|
||||||
|
<title>The Rock (1996)</title>
|
||||||
|
<meta property="og:type" content="video.movie" />
|
||||||
|
<meta property="og:url" content="http://www.imdb.com/title/tt0117500/" />
|
||||||
|
<meta property="og:image" content="http://ia.media-imdb.com/images/rock.jpg" />
|
||||||
|
<meta property="og:description"
|
||||||
|
content="Directed by Michael Bay. With Sean Connery, Nicolas Cage, Ed Harris, John Spencer.">
|
||||||
|
</head>
|
||||||
|
|
||||||
|
</html>
|
|
@ -9,6 +9,21 @@ defmodule Pleroma.Web.RichMedia.ParserTest do
|
||||||
} ->
|
} ->
|
||||||
%Tesla.Env{status: 200, body: File.read!("test/fixtures/rich_media/ogp.html")}
|
%Tesla.Env{status: 200, body: File.read!("test/fixtures/rich_media/ogp.html")}
|
||||||
|
|
||||||
|
%{
|
||||||
|
method: :get,
|
||||||
|
url: "http://example.com/non-ogp"
|
||||||
|
} ->
|
||||||
|
%Tesla.Env{status: 200, body: File.read!("test/fixtures/rich_media/non_ogp_embed.html")}
|
||||||
|
|
||||||
|
%{
|
||||||
|
method: :get,
|
||||||
|
url: "http://example.com/ogp-missing-title"
|
||||||
|
} ->
|
||||||
|
%Tesla.Env{
|
||||||
|
status: 200,
|
||||||
|
body: File.read!("test/fixtures/rich_media/ogp-missing-title.html")
|
||||||
|
}
|
||||||
|
|
||||||
%{
|
%{
|
||||||
method: :get,
|
method: :get,
|
||||||
url: "http://example.com/twitter-card"
|
url: "http://example.com/twitter-card"
|
||||||
|
@ -38,6 +53,11 @@ test "returns error when no metadata present" do
|
||||||
assert {:error, _} = Pleroma.Web.RichMedia.Parser.parse("http://example.com/empty")
|
assert {:error, _} = Pleroma.Web.RichMedia.Parser.parse("http://example.com/empty")
|
||||||
end
|
end
|
||||||
|
|
||||||
|
test "doesn't just add a title" do
|
||||||
|
assert Pleroma.Web.RichMedia.Parser.parse("http://example.com/non-ogp") ==
|
||||||
|
{:error, "Found metadata was invalid or incomplete: %{}"}
|
||||||
|
end
|
||||||
|
|
||||||
test "parses ogp" do
|
test "parses ogp" do
|
||||||
assert Pleroma.Web.RichMedia.Parser.parse("http://example.com/ogp") ==
|
assert Pleroma.Web.RichMedia.Parser.parse("http://example.com/ogp") ==
|
||||||
{:ok,
|
{:ok,
|
||||||
|
@ -51,6 +71,19 @@ test "parses ogp" do
|
||||||
}}
|
}}
|
||||||
end
|
end
|
||||||
|
|
||||||
|
test "falls back to <title> when ogp:title is missing" do
|
||||||
|
assert Pleroma.Web.RichMedia.Parser.parse("http://example.com/ogp-missing-title") ==
|
||||||
|
{:ok,
|
||||||
|
%{
|
||||||
|
image: "http://ia.media-imdb.com/images/rock.jpg",
|
||||||
|
title: "The Rock (1996)",
|
||||||
|
description:
|
||||||
|
"Directed by Michael Bay. With Sean Connery, Nicolas Cage, Ed Harris, John Spencer.",
|
||||||
|
type: "video.movie",
|
||||||
|
url: "http://www.imdb.com/title/tt0117500/"
|
||||||
|
}}
|
||||||
|
end
|
||||||
|
|
||||||
test "parses twitter card" do
|
test "parses twitter card" do
|
||||||
assert Pleroma.Web.RichMedia.Parser.parse("http://example.com/twitter-card") ==
|
assert Pleroma.Web.RichMedia.Parser.parse("http://example.com/twitter-card") ==
|
||||||
{:ok,
|
{:ok,
|
||||||
|
|
Loading…
Reference in a new issue