merge develop
[akkoma] / lib / pleroma / web / rich_media / parsers / meta_tags_parser.ex
index 7da4e7561ca54bdc8b54da1bf7f4eecdd93cffa1..9139756160034983ad6c63721e7684de8ee9a7f2 100644 (file)
@@ -1,17 +1,23 @@
+# Pleroma: A lightweight social networking server
+# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/>
+# SPDX-License-Identifier: AGPL-3.0-only
+
 defmodule Pleroma.Web.RichMedia.Parsers.MetaTagsParser do
   def parse(html, data, prefix, error_message, key_name, value_name \\ "content") do
-    with elements = [_ | _] <- get_elements(html, key_name, prefix),
-         page_title = get_page_title(html),
-         meta_data =
-           Enum.reduce(elements, data, fn el, acc ->
-             attributes = normalize_attributes(el, prefix, key_name, value_name)
-
-             Map.merge(acc, attributes)
-           end)
-           |> Map.put_new(:title, page_title) do
-      {:ok, meta_data}
+    meta_data =
+      html
+      |> get_elements(key_name, prefix)
+      |> Enum.reduce(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
-      _e -> {:error, error_message}
+      {:ok, meta_data}
     end
   end
 
@@ -30,6 +36,17 @@ defmodule Pleroma.Web.RichMedia.Parsers.MetaTagsParser do
     %{String.to_atom(data[key_name]) => data[value_name]}
   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