defmodule Pleroma.Web.RichMedia.Parsers.MetaTagsParser do
def parse(html, data, prefix, error_message, key_name, value_name \\ "content") do
- meta_data =
- html
- |> get_elements(key_name, prefix)
- |> Enum.reduce(data, fn el, acc ->
- attributes = normalize_attributes(el, prefix, key_name, value_name)
+ with elements = [_ | _] <- get_elements(html, key_name, prefix),
+ meta_data =
+ Enum.reduce(elements, data, fn el, acc ->
+ attributes = normalize_attributes(el, prefix, key_name, value_name)
- Map.merge(acc, attributes)
- end)
- |> maybe_put_title(html)
-
- if Enum.empty?(meta_data) do
- {:error, error_message}
- else
+ Map.merge(acc, attributes)
+ end) do
{:ok, meta_data}
+ else
+ _e -> {:error, error_message}
end
end
%{String.to_atom(data[key_name]) => data[value_name]}
end
-
- defp maybe_put_title(%{title: _} = meta, _), do: meta
-
- defp maybe_put_title(meta, html) do
- case get_page_title(html) do
- "" -> meta
- title -> Map.put_new(meta, :title, title)
- end
- end
-
- defp get_page_title(html) do
- Floki.find(html, "title") |> Floki.text()
- end
end
+++ /dev/null
-<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>
} ->
%Tesla.Env{status: 200, body: File.read!("test/fixtures/rich_media/ogp.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,
url: "http://example.com/twitter-card"
}}
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
assert Pleroma.Web.RichMedia.Parser.parse("http://example.com/twitter-card") ==
{:ok,