diff options
| -rw-r--r-- | lib/pleroma/web/activity_pub/mrf/mediaproxy_warming_policy.ex | 56 | 
1 files changed, 56 insertions, 0 deletions
diff --git a/lib/pleroma/web/activity_pub/mrf/mediaproxy_warming_policy.ex b/lib/pleroma/web/activity_pub/mrf/mediaproxy_warming_policy.ex new file mode 100644 index 000000000..01d21a299 --- /dev/null +++ b/lib/pleroma/web/activity_pub/mrf/mediaproxy_warming_policy.ex @@ -0,0 +1,56 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2019 Pleroma Authors <https://pleroma.social/> +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Web.ActivityPub.MRF.MediaProxyWarmingPolicy do +  @moduledoc "Preloads any attachments in the MediaProxy cache by prefetching them" +  @behaviour Pleroma.Web.ActivityPub.MRF + +  alias Pleroma.HTTP +  alias Pleroma.Web.MediaProxy + +  require Logger + +  @hackney_options [ +    pool: :media, +    recv_timeout: 10_000 +  ] + +  def perform(:prefetch, url) do +    Logger.info("Prefetching #{inspect(url)}") + +    url +    |> MediaProxy.url() +    |> HTTP.get([], adapter: @hackney_options) +  end + +  def perform(:preload, %{"object" => %{"attachment" => attachments}} = _message) do +    Enum.each(attachments, fn +      %{"url" => url} when is_list(url) -> +        url +        |> Enum.each(fn +          %{"href" => href} -> +            PleromaJobQueue.enqueue(:background, __MODULE__, [:prefetch, href]) + +          x -> +            Logger.debug("Unhandled attachment URL object #{inspect(x)}") +        end) + +      x -> +        Logger.debug("Unhandled attachment #{inspect(x)}") +    end) +  end + +  @impl true +  def filter( +        %{"type" => "Create", "object" => %{"attachment" => attachments} = _object} = message +      ) +      when is_list(attachments) and length(attachments) > 0 do +    PleromaJobQueue.enqueue(:background, __MODULE__, [:preload, message]) + +    {:ok, message} +  end + +  @impl true +  def filter(message), do: {:ok, message} +end  | 
