aboutsummaryrefslogtreecommitdiff
path: root/lib/pleroma/web/rich_media/parser.ex
blob: 6da83c6e4ab34265be75c1a623980aedd0d022c4 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
defmodule Pleroma.Web.RichMedia.Parser do
  @parsers [
    Pleroma.Web.RichMedia.Parsers.OGP,
    Pleroma.Web.RichMedia.Parsers.TwitterCard,
    Pleroma.Web.RichMedia.Parsers.OEmbed
  ]

  if Mix.env() == :test do
    def parse(url), do: parse_url(url)
  else
    def parse(url),
      do: Cachex.fetch!(:rich_media_cache, url, fn _ -> parse_url(url) end)
  end

  defp parse_url(url) do
    {:ok, %Tesla.Env{body: html}} = Pleroma.HTTP.get(url)

    html |> maybe_parse() |> get_parsed_data()
  end

  defp maybe_parse(html) do
    Enum.reduce_while(@parsers, %{}, fn parser, acc ->
      case parser.parse(html, acc) do
        {:ok, data} -> {:halt, data}
        {:error, _msg} -> {:cont, acc}
      end
    end)
  end

  defp get_parsed_data(data) when data == %{} do
    {:error, "No metadata found"}
  end

  defp get_parsed_data(data) do
    {:ok, data}
  end
end