summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorMark Felder <feld@feld.me>2024-06-20 09:00:39 -0400
committerMark Felder <feld@feld.me>2024-06-20 09:00:39 -0400
commit655ac98478d01c60f217db9d4dc56015e22b0c06 (patch)
treea1be007c2826271e1059e597fcf845d6c7e97cb7 /lib
parente1e099d3bff122a28cfd0c5c340d672050929051 (diff)
parent4a881ba366a9b067e8f6bbd30ce12a30ab0724a1 (diff)
downloadpleroma-655ac98478d01c60f217db9d4dc56015e22b0c06.tar.gz
pleroma-655ac98478d01c60f217db9d4dc56015e22b0c06.zip
Merge remote-tracking branch 'origin/develop' into fix/debug-logs
Diffstat (limited to 'lib')
-rw-r--r--lib/pleroma/web/mastodon_api/views/status_view.ex9
-rw-r--r--lib/pleroma/web/rich_media/backfill.ex49
-rw-r--r--lib/pleroma/web/rich_media/card.ex13
-rw-r--r--lib/pleroma/workers/rich_media_expiration_worker.ex15
-rw-r--r--lib/pleroma/workers/rich_media_worker.ex19
5 files changed, 38 insertions, 67 deletions
diff --git a/lib/pleroma/web/mastodon_api/views/status_view.ex b/lib/pleroma/web/mastodon_api/views/status_view.ex
index 963658b1e..d9d7e516a 100644
--- a/lib/pleroma/web/mastodon_api/views/status_view.ex
+++ b/lib/pleroma/web/mastodon_api/views/status_view.ex
@@ -8,7 +8,6 @@ defmodule Pleroma.Web.MastodonAPI.StatusView do
require Pleroma.Constants
alias Pleroma.Activity
- alias Pleroma.Config
alias Pleroma.HTML
alias Pleroma.Maps
alias Pleroma.Object
@@ -31,13 +30,7 @@ defmodule Pleroma.Web.MastodonAPI.StatusView do
# pagination is restricted to 40 activities at a time
defp fetch_rich_media_for_activities(activities) do
Enum.each(activities, fn activity ->
- fun = fn -> Card.get_by_activity(activity) end
-
- if Config.get([__MODULE__, :sync_fetching], false) do
- fun.()
- else
- spawn(fun)
- end
+ Card.get_by_activity(activity)
end)
end
diff --git a/lib/pleroma/web/rich_media/backfill.ex b/lib/pleroma/web/rich_media/backfill.ex
index 4ec50e132..1d8cc87d4 100644
--- a/lib/pleroma/web/rich_media/backfill.ex
+++ b/lib/pleroma/web/rich_media/backfill.ex
@@ -6,35 +6,25 @@ defmodule Pleroma.Web.RichMedia.Backfill do
alias Pleroma.Web.RichMedia.Card
alias Pleroma.Web.RichMedia.Parser
alias Pleroma.Web.RichMedia.Parser.TTL
- alias Pleroma.Workers.RichMediaExpirationWorker
+ alias Pleroma.Workers.RichMediaWorker
require Logger
- @backfiller Pleroma.Config.get([__MODULE__, :provider], Pleroma.Web.RichMedia.Backfill.Task)
@cachex Pleroma.Config.get([:cachex, :provider], Cachex)
- @max_attempts 3
- @retry 5_000
- def start(%{url: url} = args) when is_binary(url) do
+ @spec run(map()) ::
+ :ok | {:error, {:invalid_metadata, any()} | :body_too_large | {:content, any()} | any()}
+ def run(%{"url" => url} = args) do
url_hash = Card.url_to_hash(url)
- args =
- args
- |> Map.put(:attempt, 1)
- |> Map.put(:url_hash, url_hash)
-
- @backfiller.run(args)
- end
-
- def run(%{url: url, url_hash: url_hash, attempt: attempt} = args)
- when attempt <= @max_attempts do
case Parser.parse(url) do
{:ok, fields} ->
{:ok, card} = Card.create(url, fields)
maybe_schedule_expiration(url, fields)
- if Map.has_key?(args, :activity_id) do
+ with %{"activity_id" => activity_id} <- args,
+ false <- is_nil(activity_id) do
stream_update(args)
end
@@ -54,25 +44,16 @@ defmodule Pleroma.Web.RichMedia.Backfill do
e ->
Logger.debug("Rich media error for #{url}: #{inspect(e)}")
-
- :timer.sleep(@retry * attempt)
-
- run(%{args | attempt: attempt + 1})
+ {:error, e}
end
end
- def run(%{url: url, url_hash: url_hash}) do
- Logger.debug("Rich media failure for #{url}")
-
- negative_cache(url_hash, :timer.minutes(15))
- end
-
defp maybe_schedule_expiration(url, fields) do
case TTL.process(fields, url) do
{:ok, ttl} when is_number(ttl) ->
timestamp = DateTime.from_unix!(ttl)
- RichMediaExpirationWorker.new(%{"url" => url}, scheduled_at: timestamp)
+ RichMediaWorker.new(%{"op" => "expire", "url" => url}, scheduled_at: timestamp)
|> Oban.insert()
_ ->
@@ -80,22 +61,14 @@ defmodule Pleroma.Web.RichMedia.Backfill do
end
end
- defp stream_update(%{activity_id: activity_id}) do
+ defp stream_update(%{"activity_id" => activity_id}) do
Pleroma.Activity.get_by_id(activity_id)
|> Pleroma.Activity.normalize()
|> Pleroma.Web.ActivityPub.ActivityPub.stream_out()
end
defp warm_cache(key, val), do: @cachex.put(:rich_media_cache, key, val)
- defp negative_cache(key, ttl \\ nil), do: @cachex.put(:rich_media_cache, key, nil, ttl: ttl)
-end
-defmodule Pleroma.Web.RichMedia.Backfill.Task do
- alias Pleroma.Web.RichMedia.Backfill
-
- def run(args) do
- Task.Supervisor.start_child(Pleroma.TaskSupervisor, Backfill, :run, [args],
- name: {:global, {:rich_media, args.url_hash}}
- )
- end
+ defp negative_cache(key, ttl \\ :timer.minutes(15)),
+ do: @cachex.put(:rich_media_cache, key, nil, ttl: ttl)
end
diff --git a/lib/pleroma/web/rich_media/card.ex b/lib/pleroma/web/rich_media/card.ex
index 040066f36..72ff5e791 100644
--- a/lib/pleroma/web/rich_media/card.ex
+++ b/lib/pleroma/web/rich_media/card.ex
@@ -7,8 +7,8 @@ defmodule Pleroma.Web.RichMedia.Card do
alias Pleroma.HTML
alias Pleroma.Object
alias Pleroma.Repo
- alias Pleroma.Web.RichMedia.Backfill
alias Pleroma.Web.RichMedia.Parser
+ alias Pleroma.Workers.RichMediaWorker
@cachex Pleroma.Config.get([:cachex, :provider], Cachex)
@config_impl Application.compile_env(:pleroma, [__MODULE__, :config_impl], Pleroma.Config)
@@ -75,17 +75,18 @@ defmodule Pleroma.Web.RichMedia.Card do
def get_by_url(nil), do: nil
- @spec get_or_backfill_by_url(String.t(), map()) :: t() | nil
- def get_or_backfill_by_url(url, backfill_opts \\ %{}) do
+ @spec get_or_backfill_by_url(String.t(), keyword()) :: t() | nil
+ def get_or_backfill_by_url(url, opts \\ []) do
if @config_impl.get([:rich_media, :enabled]) do
case get_by_url(url) do
%__MODULE__{} = card ->
card
nil ->
- backfill_opts = Map.put(backfill_opts, :url, url)
+ activity_id = Keyword.get(opts, :activity, nil)
- Backfill.start(backfill_opts)
+ RichMediaWorker.new(%{"op" => "backfill", "url" => url, "activity_id" => activity_id})
+ |> Oban.insert()
nil
@@ -137,7 +138,7 @@ defmodule Pleroma.Web.RichMedia.Card do
nil
else
{:cached, url} ->
- get_or_backfill_by_url(url, %{activity_id: activity.id})
+ get_or_backfill_by_url(url, activity_id: activity.id)
_ ->
:error
diff --git a/lib/pleroma/workers/rich_media_expiration_worker.ex b/lib/pleroma/workers/rich_media_expiration_worker.ex
deleted file mode 100644
index 0b74687cf..000000000
--- a/lib/pleroma/workers/rich_media_expiration_worker.ex
+++ /dev/null
@@ -1,15 +0,0 @@
-# Pleroma: A lightweight social networking server
-# Copyright © 2017-2022 Pleroma Authors <https://pleroma.social/>
-# SPDX-License-Identifier: AGPL-3.0-only
-
-defmodule Pleroma.Workers.RichMediaExpirationWorker do
- alias Pleroma.Web.RichMedia.Card
-
- use Oban.Worker,
- queue: :background
-
- @impl Oban.Worker
- def perform(%Job{args: %{"url" => url} = _args}) do
- Card.delete(url)
- end
-end
diff --git a/lib/pleroma/workers/rich_media_worker.ex b/lib/pleroma/workers/rich_media_worker.ex
new file mode 100644
index 000000000..f18ac658a
--- /dev/null
+++ b/lib/pleroma/workers/rich_media_worker.ex
@@ -0,0 +1,19 @@
+# Pleroma: A lightweight social networking server
+# Copyright © 2017-2022 Pleroma Authors <https://pleroma.social/>
+# SPDX-License-Identifier: AGPL-3.0-only
+
+defmodule Pleroma.Workers.RichMediaWorker do
+ alias Pleroma.Web.RichMedia.Backfill
+ alias Pleroma.Web.RichMedia.Card
+
+ use Oban.Worker, queue: :background, max_attempts: 3, unique: [period: 300]
+
+ @impl Oban.Worker
+ def perform(%Job{args: %{"op" => "expire", "url" => url} = _args}) do
+ Card.delete(url)
+ end
+
+ def perform(%Job{args: %{"op" => "backfill", "url" => _url} = args}) do
+ Backfill.run(args)
+ end
+end