logo

pleroma

My custom branche(s) on git.pleroma.social/pleroma/pleroma

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