mediaproxy_warming_policy.ex (1588B)
1 # Pleroma: A lightweight social networking server 2 # Copyright © 2019 Pleroma Authors <https://pleroma.social/> 3 # SPDX-License-Identifier: AGPL-3.0-only 4 5 defmodule Pleroma.Web.ActivityPub.MRF.MediaProxyWarmingPolicy do 6 @moduledoc "Preloads any attachments in the MediaProxy cache by prefetching them" 7 @behaviour Pleroma.Web.ActivityPub.MRF 8 9 alias Pleroma.HTTP 10 alias Pleroma.Web.MediaProxy 11 alias Pleroma.Workers.BackgroundWorker 12 13 require Logger 14 15 @hackney_options [ 16 pool: :media, 17 recv_timeout: 10_000 18 ] 19 20 def perform(:prefetch, url) do 21 Logger.debug("Prefetching #{inspect(url)}") 22 23 url 24 |> MediaProxy.url() 25 |> HTTP.get([], adapter: @hackney_options) 26 end 27 28 def perform(:preload, %{"object" => %{"attachment" => attachments}} = _message) do 29 Enum.each(attachments, fn 30 %{"url" => url} when is_list(url) -> 31 url 32 |> Enum.each(fn 33 %{"href" => href} -> 34 BackgroundWorker.enqueue("media_proxy_prefetch", %{"url" => href}) 35 36 x -> 37 Logger.debug("Unhandled attachment URL object #{inspect(x)}") 38 end) 39 40 x -> 41 Logger.debug("Unhandled attachment #{inspect(x)}") 42 end) 43 end 44 45 @impl true 46 def filter( 47 %{"type" => "Create", "object" => %{"attachment" => attachments} = _object} = message 48 ) 49 when is_list(attachments) and length(attachments) > 0 do 50 BackgroundWorker.enqueue("media_proxy_preload", %{"message" => message}) 51 52 {:ok, message} 53 end 54 55 @impl true 56 def filter(message), do: {:ok, message} 57 58 @impl true 59 def describe, do: {:ok, %{}} 60 end